【问题标题】:Amazon S3 bucket data download programmatically owned by third party以编程方式由第三方拥有的 Amazon S3 存储桶数据下载
【发布时间】:2017-06-28 03:47:51
【问题描述】:

我是 S3 的新手。我们的一个供应商正在与我们共享一个存储桶和对象。我们创建了一个 AWS 账户并将我们的团队成员添加为用户。我们可以通过 amazon aws cli 访问存储桶中的数据。我正在寻找 Java API 以编程方式下载数据。

我的代码是:

/*
 * Create your credentials file at ~/.aws/credentials (C:\Users\USER_NAME\.aws\credentials for Windows users) 
 * and save the following lines after replacing the underlined values with your own.
 *
 * [default]
 * aws_access_key_id = YOUR_ACCESS_KEY_ID
 * aws_secret_access_key = YOUR_SECRET_ACCESS_KEY
 */
AmazonS3 s3 = new AmazonS3Client();
Region usEast1 = Region.getRegion(Regions.US_EAST_1);
s3.setRegion(usEast1);
System.out.println("Downloading an object");
S3Object object = s3.getObject(new GetObjectRequest("exports.xyz.t-z", "abc/2015/12/07/62542f4f0164689f5d18cf6-2c324750-6c47-11e5-0e29-00deb82fd81f"));
System.out.println("Content-Type: "  + object.getObjectMetadata().getContentType());

错误信息是:

Downloading an object
Caught an AmazonServiceException, which means your request made it to Amazon S3, but was rejected with an error response for some reason.
Error Message:    The specified key does not exist. (Service: Amazon S3; Status Code: 404; Error Code: NoSuchKey; Request ID: 3DD21D3934A4456D)
HTTP Status Code: 404
AWS Error Code:   NoSuchKey
Error Type:       Client
Request ID:       3DD21D3934A4456D

现在,正如错误消息所说:密钥不存在,我不确定密钥是什么。数据由供应商放置到 s3。

但是,我可以使用以下代码访问数据以查看 s3 目录中列出的内容。 (也可以参考我的previous post

System.out.println("Listing objects");
ObjectListing objectListing = s3.listObjects(
    new ListObjectsRequest().withBucketName("exports.xyz.t-z")
                            .withPrefix("abc/2015/12/07/62542f4f0164689f5d18cf6-2c324750-6c47-11e5-0e29-00deb82fd81f")
);
for (S3ObjectSummary objectSummary : objectListing.getObjectSummaries()) {
    System.out.println(" - " + objectSummary.getKey() + "  " +
            "(size = " + objectSummary.getSize() + ")");
}

下载数据的最佳推荐方式是什么?

【问题讨论】:

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


    【解决方案1】:

    您似乎正在尝试下载“目录”而不是该目录中的特定键。

    您有列出具有该前缀的对象的代码。当您尝试使用 getObject(new GetObjectRequest()) 下载文件时,GetObjectRequest 构造函数的第二个参数必须是您调用 objectSummary.getKey() 时返回的值之一。

    【讨论】:

    • 再次感谢 Rob .. 实际上我正要发布答案。确切地说,正如您所提到的,我有运行下载的代码和相同的代码......我可以创建一个数据流......并处理该流。有没有办法直接将文件下载到本地目录?或者正如你提到的下载整个文件夹?
    • S3 不是文件系统,因此文件夹的概念不适用。有关这方面的更多信息,请参阅我对 this question 的回答。
    • 我不知道使用 Java API 作为单个操作“下载整个文件夹”的方法 - 我认为您必须列出对象并明确下载每个对象。如果您可以使用 CLI 界面,则有一个命令可以执行此操作。见docs.aws.amazon.com/cli/latest/reference/s3/sync.html
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-07
    • 2016-08-30
    • 2017-11-12
    • 2017-06-11
    • 1970-01-01
    • 2019-11-05
    • 1970-01-01
    相关资源
    最近更新 更多