12

我正在使用Amazon 提供的AWS Java SDK与 S3 服务进行交互。

似乎默认情况下,SDK 对存储桶使用虚拟主机样式(即存储桶由存储桶名称.s3.amazonaws.com 引用。例如:

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

请问Ja​​va SDK可以使用path-style吗?在积极的情况下,我该怎么做?我查看了 ClientConfiguration 和 AmazonS3Client 类,但我没有看到任何方法来做到这一点......

如果重要的话,我的 SDK 版本是:2.0.0v201206151133。

谢谢!


费尔明

PD。为简单起见,示例中省略了一些标题。

编辑: 这样的功能(用于配置 AmazonS3Client 使用的 URL 路径样式)在您有带有点(“。”)的存储桶的情况下非常有用。具有虚拟主机样式的 HTTPS 请求不起作用,请参阅thisthis

4

3 回答 3

25

withPathStyleAccess方法已被弃用。请改用以下内容:

AmazonS3 s3client = AmazonS3Client.builder()
            .withCredentials((new AWSStaticCredentialsProvider(credentials)))
            .withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration("host", "region"))
            .withPathStyleAccessEnabled(true)
            .build();

不推荐使用的方法:

现在这是可能的,我不确定它是什么时候引入的,但它至少在 Java AWS SDK 的 1.7.8 版本中可用。

只需在您的 AmazonS3 实例上调用setClientOptions :

AmazonS3 client = new AmazonS3Client(credentials);
client.setS3ClientOptions(new S3ClientOptions().withPathStyleAccess(true));
于 2014-06-03T10:37:32.367 回答
7

对于 SDK v2,您可以通过以下方式启用路径样式:

    public S3Client build() {

        final S3Configuration config = S3Configuration.builder()
                .pathStyleAccessEnabled(true)
                .build();

        return S3Client.builder()
                .serviceConfiguration(config)
                // other set up
                .build();
    }

亚马逊原计划从 2020 年 9 月起弃用路径样式访问,但此弃用已被推迟:https ://forums.aws.amazon.com/ann.jspa?annID=6776

于 2020-05-04T22:25:21.127 回答
-2

无法使用 Java SDK 强制 V1(路径样式)存储桶寻址。唯一的例外是您的存储桶名称无法通过 DNS 寻址,在这种情况下,SDK 将自动使用 V1 寻址。例如,当您的存储桶名称包含句点时(因此不鼓励这样做),就会发生这种情况。

如果你想要这个功能,你必须修改AmazonS3Client类以允许它。

https://github.com/amazonwebservices/aws-sdk-for-java/

但是,我不确定我是否相信您“需要”使用 V1 存储桶寻址的说法。SDK 已经处理了所有需要 V1 寻址的情况——或者如果您发现不需要的情况,请在论坛中告诉我们。

https://forums.aws.amazon.com/forum.jspa?forumID=70

于 2012-10-14T23:32:19.840 回答