当前位置:   article > 正文

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

software.amazon.awssdk

背景

  • 由于项目有私网部署需求,对象存储选用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目前没有提供添加拦截器的接口,但查看源码后发现内部是支持的,因此可以通过反射强制添加拦截器处理,复用上文中的拦截器对象
  • 核心代码测试用例如下,可以在使用时根据业务场景进行封装
  1. package s3.aliyunoss;
  2. import lombok.Cleanup;
  3. import lombok.SneakyThrows;
  4. import lombok.extern.slf4j.Slf4j;
  5. import org.junit.jupiter.api.Disabled;
  6. import org.junit.jupiter.api.Test;
  7. import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
  8. import software.amazon.awssdk.auth.credentials.AwsCredentials;
  9. import software.amazon.awssdk.awscore.AwsRequestOverrideConfiguration;
  10. import software.amazon.awssdk.core.client.config.ClientOve
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/706986
推荐阅读
相关标签
  

闽ICP备14008679号