背景
- 由于项目有私网部署需求,对象存储选用MinIO,公网使用阿里云OSS,故选用S3 SDK统一进行操作
- MinIO全流程正常
- 阿里云OSS限定必须以Virtual hosted style方式访问,因此在指定bucket的同时,还需要在域名中加入bucket前缀,但经测试任意的对象操作的路径都会被转换为/{bucket}/{key}的方式(Path Style),导致阿里云多创建了一层bucket目录。
- Aws sdk 版本为software.amazon.awssdk:s3:2.17.214
- 需要使用到新版的签名分片上传链接功能,而v1版本并不支持
原因
解决方案
- 在创建S3Client对象时添加拦截器ExecutionInterceptor,根据具体业务场景修改默认的SdkHttpRequest对象
- 在创建S3Presigner 时,由于sdk目前没有提供添加拦截器的接口,但查看源码后发现内部是支持的,因此可以通过反射强制添加拦截器处理,复用上文中的拦截器对象
- 核心代码测试用例如下,可以在使用时根据业务场景进行封装
package s3.aliyunoss;
import lombok.Cleanup;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
import software.amazon.awssdk.auth.credentials.AwsCredentials;
import software.amazon.awssdk.awscore.AwsRequestOverrideConfiguration;
import software.amazon.awssdk.core.client.config.ClientOve