繁体   English   中英

如何使用提供的 url 从 s3 下载文件?

[英]How to download a file from s3 using provided url?

在我的应用程序中,我将获得 s3 文件的 url,如: https : //s3.amazonaws.com/account-update/input.csv我必须下载它然后处理它。 我已经做了什么:

AmazonS3 s3 = new AmazonS3Client(credentials);
S3Object s3object = s3.getObject(new GetObjectRequest(
bucketName, key));

我可以通过提供存储桶名称和密钥来下载文件,但是如何仅使用 url( https://s3.amazonaws.com/account-update/input.csv ) 下载文件?

您可以通过标准 curl/wget 下载文件,就像从 Internet 下载任何其他文件一样。

然而,重要的部分是允许从 Amazon S3访问对象 几个选项:

  • 使对象公开可读:这可以通过控制台或 CLI/API 来完成。 但是,任何拥有该 URL 的人都可以下载它。
  • 创建Amazon S3 存储桶策略,授予对所需文件/目录/存储桶的读取访问权限。 但是,同样,任何拥有 URL 的人都可以访问这些对象。
  • 保持对象私有,但使用预先签名的 URL ,该 URL 向URL添加参数以证明您有权下载该对象。 这个预先签名的 URL 是有时间限制的,可以使用当前的 AWS 凭证通过几行代码生成。

您可以考虑使用 AWS SDK 类AmazonS3URI ,如下所示:

URI fileToBeDownloaded = new URI(" https://s3.amazonaws.com/account-update/input.csv"); 

AmazonS3URI s3URI = new AmazonS3URI(fileToBeDownloaded);

S3Object s3Object = s3Client.getObject(s3URI.getBucket(), s3URI.getKey());

从这里开始,您应该能够使用以与代码中显示的 s3Object 类似的方式获得的 s3Object。

有关使用此类的更多 Java 相关 AWS SDK 示例,请在此处查看

要启用 HTTP 访问,您必须在 S3 控制台中将存储桶设置为静态网站 请注意,除非您设置了适当的S3 访问控制,否则这会将您的所有数据暴露给网络

但是,您通过 Java SDK 访问的方法不会使用这种类型的连接。 它将通过内置的 S3 协议进行连接。 您应该检查您的 IAM 角色或策略以确保您拥有正确的权限 ( s3:GetObject )。 如果对象不存在,您还需要s3:ListBucket来查看 404。

最好的方法是使用预先签名的 S3 URL 来满足您的需求。 您可以将过期时间添加到您的签名 URL,然后该 URL 不可用。

有关更多信息,请阅读以下页面:

https://docs.aws.amazon.com/AmazonS3/latest/dev/ShareObjectPreSignedURLJavaSDK.html

John Rotenstein是正确的,您可以使用标准 curl/wget 通过 URL 下载文件。

如果你想使用 Java 来做到这一点,下面的代码应该可以解决问题; 使用Apache HttpComponents

private void downloadRequest(String url, String savedFile) {
    HttpClient client = HttpClients.createDefault();

    HttpGet httpGet = new HttpGet(url);
    HttpResponse response;
    try {
        response = client.execute(httpGet);
        HttpEntity entity = response.getEntity();
        if (entity != null) {
            try (FileOutputStream outstream = new FileOutputStream(savedFile)) {
                entity.writeTo(outstream);
            } catch (IOException e) {
                LOGGER.info(e.getMessage());
            }
        }

    } catch (IOException e) {
        e.printStackTrace();
    }
} 

你不能,但你可以在上传中制作文件附件。

例如:

ObjectMetadata objectMetadata = new ObjectMetadata();
objectMetadata.setContentType("application/csv;charset=utf-8");
objectMetadata.setContentDisposition("attachment");
PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, arquivo, file, objectMetadata).withCannedAcl(CannedAccessControlList.PublicRead);
amazonS3.putObject(putObjectRequest);

我希望它有帮助。

只需在浏览器上输入网址,但请确保将\&替换为&如果您已通过 curl 下载网址,否则您将收到此错误

<Error> <Code>AuthorizationQueryParametersError</Code> <Message>X-Amz-Algorithm only supports "AWS4-HMAC-SHA256"</Message> </Error>

使用 cli:aws s3 cp s3://bucket/prefix/key targetlocalfolder

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM