当前位置: 首页 > 知识库问答 >
问题:

在JavaSDKAmazon S3中配置路径样式

戈宏义
2023-03-14

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

默认情况下,SDK对存储桶使用虚拟主机样式(即存储桶由bucket-name.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

可以在Java SDK中使用路径样式吗?在积极的情况下,我该如何做?我已经看过ClientConfiguration和AmazonS3Client类,但我没有看到任何方法可以做到这一点。。。

在重要的情况下,我的SDK版本是:2.0.0v201206151133。

谢啦!

费尔明

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

编辑:如果您有带点(“.”)的bucket,这样的功能(用于配置AmazonS3Client使用的URL路径样式)非常有用在他们身上。具有虚拟主机样式的HTTPS请求不起作用,请参见此和此。

共有3个答案

董翰墨
2023-03-14

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

如果需要此功能,必须修改AmazonS3Client类以允许它。

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

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

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

周博达
2023-03-14

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

    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

阎德义
2023-03-14

带有PathStyleAccess的方法已被弃用。请改用以下内容:

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

已弃用的方法:

这现在是可能的,我不确定它是什么时候推出的,但它至少在JavaAWSSDK的1.7.8版本中可用。

只需在AmazonS3实例上调用setClientOptions:

AmazonS3 client = new AmazonS3Client(credentials);
client.setS3ClientOptions(new S3ClientOptions().withPathStyleAccess(true));
 类似资料:
  • 问题内容: 我是Elasticsearch的新手,我想使用同义词,我在配置文件中添加了以下几行: 然后我创建了一个索引测试: } 并使用以下数据插入类型测试: onymousy.txt包含“ foo,bar,baz”,当我搜索foo时,它返回我期望的结果,但是当我搜索baz或bar时,它返回零结果: 结果: 问题答案: 我不知道,如果您的问题是因为您为“ bar”定义了错误的同义词。正如您所说的,

  • null 我希望使用标准的方法和spring的能力来自动配置bean,我不希望手动加载一些属性文件和手动配置所有bean。因此,为了解决这个问题,我创建了另一个配置应用程序--Customization.yml,并通过include将其链接到prod config中(参见上面的示例)。在这里我遇到了一个问题:我无法通过命令行参数(-dspring.config.location或任何it变体)选择

  • 我与部署在TomEE Plus中的一些JAX-RS服务发生了冲突。给定一个用注释的服务,Tomee+将其发布到。 因此,我希望为所有服务配置路径前缀,这将URL更改为。如果我自己配置了CXF(使用或不使用Spring),那么这样做将是微不足道的,因为我可以简单地更改CXF Servlet的URL模式--但是我依赖于缺省设置,在缺省设置中,除了注释之外,我不配置任何东西。那么在这种情况下我该怎么做呢

  • 使用以下存储库: 的URL自动设置为。但是它看起来很冗长,URL可以配置为<code>/people</code>并且查询类似<code</peoples吗?name=john?

  • 发生了一些非常奇怪的事情。当我输入时: 输出如下: 输入时: 输出为: 我想使用'jdk1.6.0_24',我改变了'/etc/profile'和'~/. bashrc'中的所有内容,将其指向'jdk1.6.0_24',这样的问题仍然存在。我使用的java仍然是1.8。为什么?

  • 根据代码发布的位置,blobcontainer应该进行相应的更改。我的意思是我希望在配置文件中配置“ImportContainer”。我可以这么做吗?