【问题标题】:How to get an S3 object using a URL and the 2.x Java SDK?如何使用 URL 和 2.x Java SDK 获取 S3 对象?
【发布时间】:2019-10-23 17:13:28
【问题描述】:

我正在使用 2.x AWS Java SDK (https://docs.aws.amazon.com/sdk-for-java/index.html)。我需要使用友好的 HTTP URL(例如 https://bucket.s3.region.amazonaws.com/keyhttps://s3.region.amazonaws.com/bucket/key)获取 S3 对象。

旧的 SDK 包含一个 AmazonS3URI 类,可以解析 URL 并提取存储桶和密钥。 2.x SDK 是否包含类似的功能,还是应该使用 Java 的 URI 类来解析 URL?

【问题讨论】:

    标签: java amazon-s3 aws-sdk


    【解决方案1】:

    这就是我使用来自java.netURI 所做的:

    URI uri = new URI(s3Url);
    
    String bucketName = uri.getHost();
    
    // remove the first "/"
    String prefix = uri.getPath().substring(1);
    

    【讨论】:

    • 如果存储桶名称在主机中,那应该可以工作。如果要处理存储桶名称在路径中的情况,则必须添加更多逻辑。
    • 这是我的用例:s3://bucketName/path1/path2/path3/
    • @kidnan1991 AWS SDK v2 中不存在 AmazonS3URI
    【解决方案2】:

    目前还没有使用 SDK 的方法,但 it might be available in the future。同时,您可以使用 Java 的 URI 类编写自己的代码,或者使用旧 SDK 中的 AmazonS3URI 并希望它继续工作。

    【讨论】:

      【解决方案3】:

      扩展@Bao Pham 的答案,使用new URI(s3Url) 需要添加一个try/catch,而如果您使用URI.create(s3Url),则不需要它。我还发现在已解析的部分中使用S3ObjectId 以实现可重用性很有用。

      public class S3Url {
          public static S3ObjectId decode(String urlStr) {
              URI uri = URI.create(urlStr);
              return new S3ObjectId(uri.getHost(), uri.getPath().substring(1));
          }
      }
      

      【讨论】:

      • 很遗憾,S3ObjectId 在 API 的 2.x 版本中不可用。而且此解决方案假定主机名包含存储桶,但情况并非总是如此。
      猜你喜欢
      • 2022-01-03
      • 2019-11-18
      • 1970-01-01
      • 2018-09-24
      • 2017-10-24
      • 1970-01-01
      • 2020-08-08
      • 2021-03-06
      • 2020-07-30
      相关资源
      最近更新 更多