如何使用提供的URL从S3下载文件?

25
8个回答

22

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

然而,重要的部分是要从Amazon S3中启用对对象的访问。有几个选项:

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

2
我看到了使用预签名URL上传对象的示例。我们如何生成用于下载的预签名URL? - Md. Arafat Al Mahmud
@Md.ArafatAlMahmud 请创建一个新的问题,而不是在旧问题的评论中提问。 - John Rotenstein

21

您可以考虑使用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示例,请查看此处


在新的SDK中是否有类似于AmazonS3URI的东西?我正在使用software.amazon.awssdk:s3。 - mrog
1
目前AWS SDK V2尚未提供此功能。您可以在此处进行跟踪(https://github.com/aws/aws-sdk-java-v2/issues/272)。 - Jawad

3
为了启用HTTP访问,您必须在S3控制台中将存储桶设置为静态网站。请注意,这将公开您所有的数据,除非您设置适当的S3访问控制
不过,您通过Java SDK访问的方法将不会使用此类连接,而是通过内置的S3协议进行连接。您应该检查您的IAM角色或策略,确保您具有正确的权限(s3:GetObject)。您还需要s3:ListBucket,以便在对象不存在时看到404。

1

只需在浏览器中输入URL,但如果您通过curl下载了URL,请确保将\u0026替换为&,否则您将会收到此错误。

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

1

0

你不能直接实现,但是你可以在上传时附加文件。

例如:

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);

希望它有所帮助。


0

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();
    }
} 

-4

使用命令行界面:aws s3 cp s3://bucket/prefix/key targetlocalfolder


这个问题涉及到使用带有http的url,它与常规的s3路径在CLI中的使用方式不同。 - szeitlin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接