解决AWS S3 SDK V2操作阿里云OSS的Bucket路径问题

本文介绍了在使用AWS S3 SDK V2操作阿里云OSS时遇到的Bucket路径问题,由于SDK默认采用Path Style访问导致额外创建目录。解决方案是通过添加ExecutionInterceptor自定义请求,以及利用反射在S3Presigner中添加拦截器。此方法同样适用于腾讯云和其他S3兼容的服务。
摘要由CSDN通过智能技术生成

背景

  • 由于项目有私网部署需求,对象存储选用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版本并不支持

原因

  • 新版Sdk(v2)针对Object的访问路径实际内部做了两种访问风格的自适应,但目前仅限以s3开头的域名可以仅限Virtual hosted style方式的访问,其他域名均会自动转为Path风格。关于此问题的描述在github上有相关讨论 https://github.com/aws/aws-sdk-java-v2/issues/2317。但需要修改源码,而且并非官方正式版本,不便于后期升级

解决方案

  • 在创建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
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值