调用AWS S3的putObject方法提示无法解析,已引入v1和v2版本SDK
问题原因分析
- 依赖版本冲突:你同时引入了两个大版本不兼容的AWS Java SDK:
- 组ID为
com.amazonaws的是AWS SDK v1版本 - 组ID为
software.amazon.awssdk的是AWS SDK v2版本
两个版本的S3客户端接口、方法签名完全不同,混用就会出现方法找不到的报错。
- 组ID为
- API调用不匹配:你当前写的
PutObjectRequest.builder()、RequestBody.fromInputStream、双参数putObject写法是AWS SDK v2的标准语法,如果你的s3client实际初始化的是v1版本的AmazonS3类实例,就会找不到对应的putObject方法。
修复方案
你可以选择任意一种方案统一SDK版本即可,推荐使用官方主推的v2版本。
方案1:统一使用AWS SDK v2
- 首先移除项目中v1版本的依赖,删除如下配置:
<dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-java-sdk</artifactId> <version>1.11.133</version> </dependency>
- 确认你的
s3client是通过v2规范初始化的,参考初始化代码:
import software.amazon.awssdk.auth.credentials.DefaultCredentialsProvider; import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.s3.S3Client; // 实例化S3客户端 S3Client s3client = S3Client.builder() .region(Region.of("你的存储桶对应的区域编码,例如cn-north-1")) .credentialsProvider(DefaultCredentialsProvider.create()) .build();
- 额外可优化现有代码,不需要额外创建临时文件,直接使用MultipartFile的输入流即可,减少不必要的IO操作:
@Override public UploadResponse upload(MultipartFile audio) throws IOException { String fileName = audio.getOriginalFilename(); try (InputStream inputStream = audio.getInputStream()) { uploadToS3(fileName, inputStream, audio.getSize()); } return null; } private void uploadToS3(String fileName, InputStream in, long size) { PutObjectRequest putObjectRequest = PutObjectRequest.builder() .bucket(bucketName) .key(fileName) .build(); RequestBody requestBody = RequestBody.fromInputStream(in, size); s3client.putObject(putObjectRequest, requestBody); }
方案2:统一使用AWS SDK v1
如果项目已有大量v1版本的历史代码,可选择保留v1,移除v2的依赖,删除如下配置:
<dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>s3</artifactId> <version>2.17.23</version> </dependency>
将上传逻辑改为v1版本的API写法:
import com.amazonaws.services.s3.model.ObjectMetadata; private void uploadToS3(String fileName, InputStream in, long size) { ObjectMetadata metadata = new ObjectMetadata(); metadata.setContentLength(size); // v1版本的putObject为四参数签名 s3client.putObject(bucketName, fileName, in, metadata); }
注意v1版本的s3client是com.amazonaws.services.s3.AmazonS3类型的实例。
内容的提问来源于stack exchange,提问作者aaaaaajib
相关产品推荐
相关产品推荐

