在Java SDK Amazon S3中配置路径样式
我正在使用Amazon提供的与S3服务交互 默认情况下,SDK对bucket使用虚拟主机样式(即bucket-name.s3.amazonaws.com引用bucket)。示例:在Java SDK Amazon S3中配置路径样式,java,amazon-s3,amazon-web-services,Java,Amazon S3,Amazon Web Services,我正在使用Amazon提供的与S3服务交互 默认情况下,SDK对bucket使用虚拟主机样式(即bucket-name.s3.amazonaws.com引用bucket)。示例: PUT / HTTP/1.1 Host: a-given-bucket.s3.amazonaws.com Date: Tue, 26 Jun 2012 10:39:40 GMT Content-Type: application/x-www-form-urlencoded; charset=utf-8 Content-
PUT / HTTP/1.1
Host: a-given-bucket.s3.amazonaws.com
Date: Tue, 26 Jun 2012 10:39:40 GMT
Content-Type: application/x-www-form-urlencoded; charset=utf-8
Content-Length: 0
但是,我需要在应用程序中使用路径样式,如下所示:
PUT /a-given-bucket/ HTTP/1.1
Host: s3.amazonaws.com
Date: Thu, 21 Jun 2012 16:27:32 GMT
Content-Type: application/x-www-form-urlencoded; charset=utf-8
Content-Length: 0
有可能在Java SDK中使用路径样式吗?在积极的情况下,我该怎么做?我已经看过ClientConfiguration和AmazonS3Client类,但我没有看到任何方法可以做到这一点
我的SDK版本是:2.0.0v201206151133
谢谢
费尔明 为了简单起见,样本中省略了一些标题 编辑:
这样的功能(用于配置AmazonS3Client使用的URL路径样式)在存储桶中带有点(“.”)的情况下非常有用。具有虚拟主机样式的HTTPS请求不起作用,请参阅和。无法强制V1(路径样式)使用Java SDK进行bucket寻址。唯一的例外是当您的bucket名称不可DNS寻址时,在这种情况下,SDK将自动使用V1寻址。例如,当您的bucket名称包含句点时(因此不鼓励使用句点) 如果需要此功能,则必须修改
AmazonS3Client
类以允许此功能
但是,我不确定我是否相信你的说法,你“需要”使用V1 bucket寻址。SDK已经处理了所有需要V1寻址的情况——或者如果你发现了一个不需要V1寻址的情况,请在论坛上告诉我们
不推荐使用PathStyleAccess方法。请改用以下方法:
AmazonS3 s3client = AmazonS3Client.builder()
.withCredentials((new AWSStaticCredentialsProvider(credentials)))
.withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration("host", "region"))
.withPathStyleAccessEnabled(true)
.build();
不推荐的方法: 现在这是可能的,我不确定它是什么时候引入的,但它至少在JavaAWSSDK的1.7.8版本中可用 只需访问您的AmazonS3实例:
AmazonS3 client = new AmazonS3Client(credentials);
client.setS3ClientOptions(new S3ClientOptions().withPathStyleAccess(true));
对于SDK v2,您可以通过以下操作启用路径样式:
public S3Client build() {
final S3Configuration config = S3Configuration.builder()
.pathStyleAccessEnabled(true)
.build();
return S3Client.builder()
.serviceConfiguration(config)
// other set up
.build();
}
亚马逊计划从2020年9月开始反对路径式访问,但这一反对已被推迟:也在AWS开发者论坛上发布:亲爱的@Zach,您可能会拒绝它,但只要其他兼容解决方案和AWS SDK能够很好地集成,人们通常会实施需要能够使用AWS S3的软件要点。例如,IBM SpectrumScale具有S3仿真支持。你可以说“为什么我们需要支持第三方解决方案”。换一种方式思考:为什么人们应该迁移到AWS S3?只有当他们能够放置允许转换的SDK时,他们才能这样做。这需要对现有存储的全面支持,这些存储在仿真模式下工作,具有一定的兼容性,我认为问题。这也不是真的,路径式访问可以按照@oggmonster答案强制执行