【问题标题】:How to download files from Amazon S3?如何从 Amazon S3 下载文件?
【发布时间】:2015-12-16 14:02:11
【问题描述】:

我在名为 BucketA 的存储桶中有一个名为 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.

【问题讨论】:

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


    【解决方案1】:

    请记住,S3 不是文件系统,而是object store。两者之间有很大的不同,一个是目录式的活动根本行不通。

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

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

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

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

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

    【讨论】:

      【解决方案2】:

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

      您可能想使用类似的东西从 S3 下载对象
       new ListObjectsV2Request().withBucketName("bucketName").withDelimiter("delimiter").withPrefix("path/to/image/");
      

      S3 doc 中所述

      delimiter"/"prefix 是你的“文件夹结构”

      【讨论】:

        【解决方案3】:

        上传目录和下载目录可以使用预定义类

        供下载

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

        上传

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

        【讨论】:

          【解决方案4】:

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

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

          如果您的存储桶“bucketA”包含一个名为“输出”的文件,您可能想说

          new GetObjectRequest("bucketA", "output")
          

          如果这不起作用,请检查其他事项:

          • 您使用的凭据是否有权从存储桶中读取?
          • 您是否正确拼写了所有名称?

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

          【讨论】:

          • 我想要输出文件夹中的文件。我该怎么做?
          猜你喜欢
          • 2020-05-29
          • 2014-11-28
          • 1970-01-01
          • 1970-01-01
          • 2012-10-10
          • 2012-08-29
          • 2013-07-29
          • 2013-05-08
          • 1970-01-01
          相关资源
          最近更新 更多