You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用AWS S3的putObject方法提示无法解析,已引入v1和v2版本SDK

问题原因分析
  • 依赖版本冲突:你同时引入了两个大版本不兼容的AWS Java SDK:
    1. 组ID为com.amazonaws的是AWS SDK v1版本
    2. 组ID为software.amazon.awssdk的是AWS SDK v2版本
      两个版本的S3客户端接口、方法签名完全不同,混用就会出现方法找不到的报错。
  • API调用不匹配:你当前写的PutObjectRequest.builder()、RequestBody.fromInputStream、双参数putObject写法是AWS SDK v2的标准语法,如果你的s3client实际初始化的是v1版本的AmazonS3类实例,就会找不到对应的putObject方法。

修复方案

你可以选择任意一种方案统一SDK版本即可,推荐使用官方主推的v2版本。

方案1:统一使用AWS SDK v2

  1. 首先移除项目中v1版本的依赖,删除如下配置:
<dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>aws-java-sdk</artifactId>
    <version>1.11.133</version>
</dependency>
  1. 确认你的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();
  1. 额外可优化现有代码,不需要额外创建临时文件,直接使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 04:18:03