【问题标题】:How to download a file from s3 using provided url?如何使用提供的 url 从 s3 下载文件?
【发布时间】:2017-10-22 13:06:46
【问题描述】:

在我的应用程序中,我将获得 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) 下载文件?

【问题讨论】:

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


    【解决方案1】:

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

    ,否则这会将您的所有数据暴露给网络

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 我看到了使用预签名 URL 上传对象的示例。我们如何生成用于下载的预签名 URL?
      • @Md.ArafatAlMahmud 请创建一个新问题,而不是通过对旧问题的评论来提问。
      【解决方案3】:

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

        【讨论】:

        • 较新的 SDK 中是否有类似于 AmazonS3URI 的内容?我正在使用 software.amazon.awssdk:s3。
        • AWS SDK V2 上尚不可用。你可以关注这个here
        【解决方案5】:

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

        【讨论】:

        • 这个问题是关于使用带有 http 的 url,它在 CLI 中的工作方式与常规 s3 路径不同。
        【解决方案6】:

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

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

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

        【讨论】:

          【解决方案7】:

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

          例如:

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

          希望对你有帮助。

          【讨论】:

            【解决方案8】:

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

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

            【讨论】:

              猜你喜欢
              • 2019-11-20
              • 1970-01-01
              • 2023-03-13
              • 2022-08-04
              • 1970-01-01
              • 1970-01-01
              • 2018-11-03
              • 2013-04-02
              • 2020-03-27
              相关资源
              最近更新 更多