You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用AWS SDK 2 for Java对接Min.io:上传成功却触发客户端错误

解决AWS SDK 2 for Java对接MinIO上传成功但触发Base16解码错误的问题

我刚碰到过一模一样的坑!从你的堆栈跟踪能明确看出,问题根源是AWS SDK 2默认启用了校验和验证逻辑,而MinIO返回的ETag(尤其是文件大小超过分片阈值时)会带有-分隔符(比如abc123-4这种格式),SDK把整个ETag字符串当成纯Base16编码的哈希值去解码,自然就抛出了Invalid base 16 character: '-'的错误。

快速修复方案

修改你的S3Configuration构建代码,添加checksumValidationEnabled(false)关闭自动校验和验证:

val confBuilder = software.amazon.awssdk.services.s3.S3Configuration
    .builder()
    .pathStyleAccessEnabled(true)
    .checksumValidationEnabled(false) // 新增这一行
    .build()

为什么这能解决问题?

MinIO的ETag规则和AWS S3略有差异:当文件通过分片上传时,MinIO的ETag会采用[分片哈希]-[分片数量]的格式,而AWS SDK 2默认会尝试把整个ETag作为纯Base16编码的校验和解析,这就和带-的MinIO ETag格式冲突了。关闭校验和验证后,SDK会跳过这个解析步骤,错误也就消失了。

额外验证点

你可以去MinIO控制台查看已上传文件的ETag,如果确实是带-的格式,那这个方案绝对能解决问题。另外AWS CLI之所以能正常运行,是因为CLI默认没有强制开启这个严格的校验和验证逻辑,和Java SDK 2的默认配置不一样。

内容的提问来源于stack exchange,提问作者Gleeb

火山引擎 最新活动