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

时间:2017-05-22 18:57:53

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

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

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

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

8 个答案:

答案 0 :(得分:4)

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

但重要的是,要从Amazon S3 启用对象的访问权限。一些选择:

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

答案 1 :(得分:4)

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

答案 2 :(得分:1)

要启用HTTP访问,您必须在S3控制台中将存储桶设置为Static Website。请注意,除非您设置正确的S3 access controls.

,否则这会将您的所有数据公开到网络上

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

答案 3 :(得分: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 :(得分:0)

最好的方法是使用预先签名的S3 URL来满足您的需求。 您可以在已签名的网址中添加到期时间,之后网址不可用。

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

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

答案 5 :(得分: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);

我希望它有所帮助。

答案 6 :(得分:0)

只需在浏览器中输入网址,但如果通过curl下载了网址,请确保将\u0026替换为&,否则会出现此错误

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

答案 7 :(得分:-1)

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