我在名为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}}
答案 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)
答案 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")
来验证存储桶实际包含的内容(如您使用的凭据所示)。