我正在尝试使用AWS SDK for Java从S3下载文件,并将特定文件存储在我的PC中的本地目录中。
我为下载对象而编写的代码是:
public void download(String key) {
S3Object obj=s3Client.getObject(new GetObjectRequest(bucketname,key));
}
但我真正想做的是将本地路径作为参数而不是密钥传递,并将下载的文件obj存储在特定目录中,如/ tmp / AWSStorage /在我的linux框中。
你能建议一种方法吗?
答案 0 :(得分:5)
我用过:
s3Client.getObject(new GetObjectRequest(bucket,key),file);
工作正常。
答案 1 :(得分:3)
有一个API可以直接将文件下载到本地路径
ObjectMetadata getObject(GetObjectRequest getObjectRequest,
File destinationFile)
答案 2 :(得分:1)
使用Java> = 1.6,您可以直接复制下载到本地目录的文件,而不会出现任何文件损坏问题。检查代码:
S3Object fetchFile = s3.getObject(new GetObjectRequest(bucketName, fileName));
final BufferedInputStream i = new BufferedInputStream(fetchFile.getObjectContent());
InputStream objectData = fetchFile.getObjectContent();
Files.copy(objectData, new File("D:\\" + fileName).toPath()); //location to local path
objectData.close();
使用Java 1.6及更高版本,您可以直接在Files.copy函数中指定路径。
答案 3 :(得分:0)
您可以使用obj.getDataInputStream()
来获取文件。然后org.apache.commons.io.IOUtils
copy
方法进行复制。
S3Object obj=s3Client.getObject(new GetObjectRequest(bucketname,key));
File file=new File("/tmp/AWSStorage/"+key);
// if the directory does not exist, create it
if (!file.getParentFile().exists()) {
file.getParentFile().mkdirs();
}
然后你可以使用以下任何一种。
try {
IOUtils.copy(obj.getDataInputStream(), new FileOutputStream(file));
} catch (Exception e) {
e.printStackTrace();
}
或强>
BufferedReader reader=null;
BufferedWriter out=null;
String data = null;
try {
reader = new BufferedReader(new InputStreamReader(fileObj.getDataInputStream()));
out = new BufferedWriter (new FileWriter(file));
while ((data = reader.readLine()) != null) {
out.write(data);
}
} catch (Exception e) {
e.printStackTrace();
}
finally {
reader.close();
out.close();
}
答案 4 :(得分:-3)
在S3Object obj=s3Client.getObject(new GetObjectRequest(bucketname,key));
行中
bucketname是S3BucketName,Key是对象名,它不是本地文件路径。
键 - 是common-prefix / objectname
即。如果你的文件保存在存储桶的根目录下,那么只有对象的名称才是密钥,即myfile.txt 但是如果您的文件保存为myfolder1 / myfolder2 / myfile.txt那么 myfolder1 / myfolder是你的公共前缀,myfile.txt是objectname。
S3Object obj=s3Client.getObject(new GetObjectRequest(bucketname,"myfolder1/myfolder2/myfile.txt"));