如何从Amazon S3下载文件?

时间:2015-12-16 14:02:11

标签: java amazon-web-services amazon-s3

我在名为BucketA的广告位中有一个名为output的文件夹。我在AmazonS3Client s3Client = new AmazonS3Client(credentials); File localFile = new File("/home/abc/Desktop/AmazonS3/"); s3Client.getObject(new GetObjectRequest("bucketA", "/bucketA/output/"), localFile); 文件夹中有一个文件列表。如何使用AWS Java SDK将它们下载到本地计算机?

以下是我的代码:

AmazonS3Exception: The specified key does not exist.

我收到了错误:

{{1}}

4 个答案:

答案 0 :(得分:5)

请记住,S3不是文件系统,而是object store。两者之间存在巨大差异,一个是目录式活动根本不起作用。

假设您有一个包含两个对象的S3存储桶:

/path/to/file1.txt
/path/to/file2.txt

使用这些对象时,在处理文件系统目录中的文件时,不能简单地引用/path/to/。那是因为/path/to/不是一个目录,而只是一个非常大的哈希表中一个键的一部分。这就是错误消息指示的问题的原因。这些不是文件名路径,而是对象库中对象的键。

要复制/path/to/等位置的所有文件,您需要分多步执行。{p>首先,您需要获取其键以/path/to开头的所有对象的列表,然后您需要遍历每个单独的对象并逐个复制它们。

Here is a similar question的答案显示了如何使用Java从S3下载多个文件。

答案 1 :(得分:2)

我知道很久以前就问过这个问题了,但这个答案对某些人来说可能有所帮助。

您可能希望使用类似的东西从S3

下载对象
zorder

S3 doc

中所述

分隔符 “/”前缀是您的“文件夹,如结构”

答案 2 :(得分:1)

您可以将预定义的类用于上传目录和下载目录

用于下载

MultipleFileDownload xfer = xfer_mgr.downloadDirectory(
    bucketName, key, new File("C:\\Users\\miracle\\Deskto\\Downloads"));

用于上传

MultipleFileUpload xfer = xfer_mgr.uploadDirectory(bucketName, key,Dir,true);

答案 3 :(得分:0)

错误消息表示存储桶(在本例中为#34; bucketA")不包含具有您指定名称的文件(在本例中为" / bucketA / output /" )。

指定密钥时,请勿在密钥中包含存储桶名称。 S3支持"文件夹"在键中,用" /"分隔,所以你可能不想尝试使用以" /"结尾的键。

如果您的水桶"水桶A"包含一个名为" output"的文件,你可能想说

new GetObjectRequest("bucketA", "output")

如果这不起作用,还需要检查其他事项:

  • 您使用的凭据是否有权从存储桶中读取数据?
  • 你拼错了所有名字吗?

您可能希望使用listObjects("bucketA")来验证存储桶实际包含的内容(如您使用的凭据所示)。