如何将下载的文件对象从S3存储到本地目录

时间:2014-01-20 08:43:53

标签: java file amazon-s3 download

我正在尝试使用AWS SDK for Java从S3下载文件,并将特定文件存储在我的PC中的本地目录中。

我为下载对象而编写的代码是:

public void download(String key) {
S3Object obj=s3Client.getObject(new GetObjectRequest(bucketname,key));
}

但我真正想做的是将本地路径作为参数而不是密钥传递,并将下载的文件obj存储在特定目录中,如/ tmp / AWSStorage /在我的linux框中。

你能建议一种方法吗?

5 个答案:

答案 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"));