You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Amazon S3Client可正常列举存储桶,但执行putObject时抛出UnknownHostException问题求助

Amazon S3Client可正常列举存储桶,但执行putObject时抛出UnknownHostException问题求助

这个问题我之前踩过坑,大概率是AWS SDK的访问路径模式导致的!

问题原因分析

当你调用listBuckets()时,请求是直接发送到你配置的主endpoint地址:https://cees3.bhinc.gov:10444,这时候DNS能正常解析,所以请求成功。

但执行putObject()时,AWS SDK默认会使用虚拟主机风格构造请求URL——它会把桶名作为子域名拼在主endpoint前面,变成类似https://testbucket2.cees3.bhinc.gov:10444的地址。而你的私有S3存储服务大概率没有配置这个子域名的DNS解析,或者本身不支持虚拟主机模式,所以就抛出了UnknownHostException。

解决方案:开启路径式访问

只需要在构建S3Client时,添加配置强制使用路径式访问(也就是把桶名放在URL路径里,而不是子域名),具体修改如下:

修改你的S3Client构建代码,加上serviceConfiguration配置项:

// Create S3 client
S3Client s3Client = S3Client.builder()
        .credentialsProvider(credentialsProvider)
        .region(Region.US_EAST_1)
        .endpointOverride(URI.create("https://cees3.bhinc.gov:10444"))
        // 新增这部分配置,开启路径式访问
        .serviceConfiguration(S3Configuration.builder()
                .pathStyleAccessEnabled(true)
                .build())
        .overrideConfiguration(ClientOverrideConfiguration.builder()
                .build())
        .build();

这样修改后,上传对象的请求会变成https://cees3.bhinc.gov:10444/testbucket2/[你的对象键],和listBuckets的请求域名一致,就能正常解析了。

额外小提示

看你的代码里putObject的key参数用的是accessKeyId,这应该是测试时的临时写法吧?记得改成实际的对象键(比如"test.png"),不然会把文件覆盖成同一个key哦。

备注:内容来源于stack exchange,提问作者Tim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 09:35:28