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

Spring Boot中AWS S3文件上传报错及配置示例求助

问题分析

报错核心是AWS凭证加载失败,SDK遍历了所有默认凭证提供者链,均未找到有效凭证,导致无法建立与S3服务的连接。

解决方案

1. 凭证配置的几种有效方式

方式一:Spring Boot配置文件(推荐)

在application.yml中添加AWS配置:

aws:
  access-key: 你的AWS_ACCESS_KEY
  secret-key: 你的AWS_SECRET_KEY
  region: 你的AWS区域 # 例如ap-southeast-1、us-east-1
  s3:
    bucket: 目标桶名称

方式二:本地AWS凭证文件

在用户目录下创建.aws/credentials文件(Windows路径:C:\Users\<用户名>\.aws\credentials;Linux/macOS路径:~/.aws/credentials),内容如下:

[default]
aws_access_key_id = 你的AWS_ACCESS_KEY
aws_secret_access_key = 你的AWS_SECRET_KEY

同时创建.aws/config文件指定区域:

[default]
region = 你的AWS区域

方式三:代码显式指定凭证(仅适合测试场景)

直接在代码中传入凭证信息,生产环境不建议使用。

完整示例代码

1. AWS S3配置类(Spring Boot)

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.s3.S3Client;
import software.amazon.awssdk.transfer.s3.S3TransferManager;

@Configuration
public class AwsS3Config {

    @Value("${aws.access-key}")
    private String accessKey;

    @Value("${aws.secret-key}")
    private String secretKey;

    @Value("${aws.region}")
    private String region;

    @Bean
    public S3Client s3Client() {
        AwsBasicCredentials credentials = AwsBasicCredentials.create(accessKey, secretKey);
        return S3Client.builder()
                .credentialsProvider(StaticCredentialsProvider.create(credentials))
                .region(Region.of(region))
                .build();
    }

    @Bean
    public S3TransferManager s3TransferManager() {
        return S3TransferManager.builder()
                .s3Client(s3Client())
                .build();
    }
}

2. 文件上传服务类

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import software.amazon.awssdk.transfer.s3.FileUpload;
import software.amazon.awssdk.transfer.s3.S3TransferManager;
import software.amazon.awssdk.transfer.s3.UploadFileRequest;
import software.amazon.awssdk.transfer.s3.progress.LoggingTransferListener;

import java.nio.file.Paths;

@Service
public class S3FileUploadService {

    private final S3TransferManager transferManager;

    @Value("${aws.s3.bucket}")
    private String bucketName;

    public S3FileUploadService(S3TransferManager transferManager) {
        this.transferManager = transferManager;
    }

    public void uploadFile(String localFilePath, String s3Key) {
        UploadFileRequest uploadFileRequest = UploadFileRequest.builder()
                .putObjectRequest(req -> req.bucket(bucketName).key(s3Key))
                .addTransferListener(LoggingTransferListener.create())
                .source(Paths.get(localFilePath))
                .build();

        FileUpload upload = transferManager.uploadFile(uploadFileRequest);
        // 等待上传完成
        upload.completionFuture().join();
    }
}

3. Maven依赖配置

<dependencies>
    <!-- Spring Boot Web -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    
    <!-- AWS S3 SDK -->
    <dependency>
        <groupId>software.amazon.awssdk</groupId>
        <artifactId>s3</artifactId>
    </dependency>
    <!-- S3 Transfer Manager -->
    <dependency>
        <groupId>software.amazon.awssdk</groupId>
        <artifactId>s3-transfer-manager</artifactId>
        <version>2.20.131</version> <!-- 使用与SDK兼容的最新版本 -->
    </dependency>
</dependencies>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>software.amazon.awssdk</groupId>
            <artifactId>bom</artifactId>
            <version>2.20.131</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
注意事项
  • 生产环境禁止硬编码凭证,优先使用IAM角色(部署在ECS/EKS/EC2时)或环境变量注入凭证。
  • 确保AWS账号拥有目标S3桶的PutObject权限,避免权限不足报错。
  • 如果使用SSO凭证,需添加sso模块依赖:
<dependency>
    <groupId>software.amazon.awssdk</groupId>
    <artifactId>sso</artifactId>
</dependency>

内容的提问来源于stack exchange,提问作者이상빈

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 02:17:06