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

如何使用Spring Boot/Java实现AWS S3桶中MP3音频文件的上传与下载

Spring Boot + Java 实现AWS S3桶MP3文件上传与下载

1. 添加项目依赖

在pom.xml中引入必要的依赖,包括Spring Web、AWS S3 SDK:

<dependencies>
    <!-- Spring Web 用于构建REST接口 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!-- AWS S3 SDK -->
    <dependency>
        <groupId>com.amazonaws</groupId>
        <artifactId>aws-java-sdk-s3</artifactId>
        <version>1.12.500</version>
    </dependency>
    <!-- Spring Boot 配置处理器(可选,用于配置提示) -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-configuration-processor</artifactId>
        <optional>true</optional>
    </dependency>
</dependencies>

2. 配置AWS S3参数

在application.properties中配置AWS访问信息和S3桶名称,强烈建议通过环境变量注入,避免硬编码敏感信息:

# AWS 配置
cloud.aws.credentials.access-key=${AWS_ACCESS_KEY}
cloud.aws.credentials.secret-key=${AWS_SECRET_KEY}
cloud.aws.region.static=ap-southeast-1 # 替换为你的桶所在区域
cloud.aws.stack.auto=false

# S3 桶名称
aws.s3.bucket-name=your-mp3-bucket

3. 配置S3客户端实例

创建配置类生成AmazonS3客户端,供业务逻辑调用:

import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AwsS3Config {

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

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

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

    @Bean
    public AmazonS3 amazonS3Client() {
        BasicAWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey);
        return AmazonS3ClientBuilder.standard()
                .withCredentials(new AWSStaticCredentialsProvider(credentials))
                .withRegion(region)
                .build();
    }
}

4. 实现上传与下载业务逻辑

创建服务类,封装S3的上传和下载操作,针对MP3文件设置正确的Content-Type:

import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.model.ObjectMetadata;
import com.amazonaws.services.s3.model.S3Object;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.InputStream;

@Service
public class S3Mp3Service {

    private final AmazonS3 amazonS3;
    private final String bucketName;

    public S3Mp3Service(AmazonS3 amazonS3, @Value("${aws.s3.bucket-name}") String bucketName) {
        this.amazonS3 = amazonS3;
        this.bucketName = bucketName;
    }

    // 上传MP3文件到S3
    public String uploadMp3(MultipartFile file) throws IOException {
        // 校验文件类型
        if (!file.getContentType().equals("audio/mpeg")) {
            throw new IllegalArgumentException("仅支持上传MP3格式文件");
        }

        String fileName = file.getOriginalFilename();
        ObjectMetadata metadata = new ObjectMetadata();
        metadata.setContentType("audio/mpeg");
        metadata.setContentLength(file.getSize());

        amazonS3.putObject(bucketName, fileName, file.getInputStream(), metadata);
        return "文件上传成功,存储路径:" + bucketName + "/" + fileName;
    }

    // 从S3下载MP3文件
    public InputStream downloadMp3(String fileName) {
        S3Object s3Object = amazonS3.getObject(bucketName, fileName);
        return s3Object.getObjectContent();
    }
}

5. 编写REST接口

创建控制器,对外提供上传和下载的HTTP接口:

import org.springframework.core.io.InputStreamResource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.InputStream;

@RestController
@RequestMapping("/api/mp3")
public class Mp3Controller {

    private final S3Mp3Service s3Mp3Service;

    public Mp3Controller(S3Mp3Service s3Mp3Service) {
        this.s3Mp3Service = s3Mp3Service;
    }

    // 上传接口
    @PostMapping("/upload")
    public String uploadMp3(@RequestParam("file") MultipartFile file) throws IOException {
        return s3Mp3Service.uploadMp3(file);
    }

    // 下载接口
    @GetMapping("/download/{fileName}")
    public ResponseEntity<InputStreamResource> downloadMp3(@PathVariable String fileName) throws IOException {
        InputStream inputStream = s3Mp3Service.downloadMp3(fileName);
        HttpHeaders headers = new HttpHeaders();
        headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + fileName + "\"");
        headers.add(HttpHeaders.CONTENT_TYPE, "audio/mpeg");

        return ResponseEntity.ok()
                .headers(headers)
                .body(new InputStreamResource(inputStream));
    }
}

关键注意事项

  • IAM权限配置:确保AWS IAM用户拥有s3:PutObject和s3:GetObject权限,避免权限不足报错。
  • 文件大小限制:Spring Boot默认MultipartFile大小限制为1MB,若需上传大文件,需在application.properties中配置:
    spring.servlet.multipart.max-file-size=100MB
    spring.servlet.multipart.max-request-size=100MB
    
  • 异常处理:建议在服务层捕获AmazonServiceException、AmazonClientException等AWS相关异常,返回更友好的错误信息。
  • 文件名重复处理:若需避免同名文件覆盖,可在上传时给文件名添加时间戳或随机后缀。

内容的提问来源于stack exchange,提问作者Sourav Manna

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 23:05:29