Java 如何从AmazonS3下载文件?

Java 如何从AmazonS3下载文件?,java,amazon-web-services,amazon-s3,Java,Amazon Web Services,Amazon S3,我在一个名为BucketA的bucket中有一个名为output的文件夹。我在output文件夹中有一个文件列表。如何使用AWS Java SDK将它们下载到本地计算机 下面是我的代码: AmazonS3Client s3Client = new AmazonS3Client(credentials); File localFile = new File("/home/abc/Desktop/AmazonS3/"); s3Client.getObject(new

我在一个名为
BucketA
的bucket中有一个名为
output
的文件夹。我在
output
文件夹中有一个文件列表。如何使用AWS Java SDK将它们下载到本地计算机

下面是我的代码:

AmazonS3Client s3Client = new AmazonS3Client(credentials);
        File localFile = new File("/home/abc/Desktop/AmazonS3/");
        s3Client.getObject(new GetObjectRequest("bucketA", "/bucketA/output/"), localFile);
我得到了一个错误:

AmazonS3Exception: The specified key does not exist.

错误消息意味着bucket(在本例中为“bucketA”)不包含您指定名称的文件(在本例中为“/bucketA/output/”)

指定键时,不要在键中包含bucket名称。S3支持键中以“/”分隔的“文件夹”,因此您可能不想尝试使用以“/”结尾的键

如果您的bucket“bucketA”包含一个名为“output”的文件,您可能想说

new GetObjectRequest("bucketA", "output")
如果这不起作用,请检查其他事项:

  • 您正在使用的凭据是否具有从存储桶读取的权限
  • 你把所有的名字都拼对了吗

您可能希望使用
listObjects(“bucketA”)
来验证bucket实际包含的内容(如您使用的凭据所示)。

请记住,S3不是一个文件系统,而是一个文件系统。两者之间有很大的区别,一个是目录式的活动根本不起作用

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

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

要将所有文件复制到像
/path/to/
这样的位置,需要分多个步骤执行。首先,您需要获得其键以
/path/to
开头的所有对象的列表,然后需要循环遍历每个对象并逐个复制它们


有一个显示如何使用Java从S3下载多个文件的答案。

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

您可能希望使用类似的方法从S3下载对象

 new ListObjectsV2Request().withBucketName("bucketName").withDelimiter("delimiter").withPrefix("path/to/image/");
如报告中所述


分隔符为“/”和前缀为“文件夹式结构”。

您可以使用预定义的类来创建上载目录和下载目录

下载

MultipleFileDownload xfer = xfer_mgr.downloadDirectory(
    bucketName, key, new File("C:\\Users\\miracle\\Deskto\\Downloads"));
MultipleFileUpload xfer = xfer_mgr.uploadDirectory(bucketName, key,Dir,true);
用于上传

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

我想要输出文件夹中的文件。我该怎么做?