如何使用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
相关产品推荐
相关产品推荐

