Spring Boot 与文件上传:实现文件上传、下载、进度显示与云存储集成!

🏆本文收录于「滚雪球学SpringBoot」专栏(全网一个名),手把手带你零基础入门Spring Boot,从入门到就业,助你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
环境说明:Windows 10 + IntelliJ IDEA 2021.3.2 + Jdk 1.8
前言🚀
在现代的 Web 应用中,文件上传和下载是非常常见的需求,几乎每个应用都需要处理文件的上传和下载。无论是用户上传的图片、文档,还是系统生成的报告、日志,文件的操作都在日常工作中占据着重要的位置。Spring Boot 提供了强大的支持,能够帮助我们轻松实现文件的上传、下载、多文件上传、进度显示等功能。再结合云存储服务,如 AWS S3,可以实现更加可靠、高效的文件存储与管理。
本文将详细讲解如何使用 Spring Boot 实现文件上传与下载功能、如何实现多文件上传及进度显示,以及如何与云存储服务(如 AWS S3)进行集成,最终打造一个高效、灵活的文件上传与存储解决方案。
目录结构
- 🛠 Spring Boot 实现文件上传与下载功能
- 📂 基于 Spring Boot 的多文件上传与进度显示
- ☁️ Spring Boot 与文件存储服务(如 AWS S3)的集成
- 📌 小结
🛠 Spring Boot 实现文件上传与下载功能
文件上传与下载是 Web 应用中常见的功能,Spring Boot 提供了非常简单的方式来实现这两项功能。我们可以使用 MultipartFile
来接收上传的文件,并将其存储在服务器的指定位置。而对于文件下载,Spring Boot 提供了 ResponseEntity
类来返回文件流,供客户端下载。
文件上传实现
Spring Boot 提供了 MultipartFile
来接收文件,文件可以通过 HTTP 请求上传至服务器,并存储在本地或其他指定位置。以下是一个简单的文件上传功能实现。
文件上传控制器
@RestController
@RequestMapping("/file")
public class FileController {
private static final String UPLOAD_DIR = "uploads/";
// 文件上传接口
@PostMapping("/upload")
public ResponseEntity<String> uploadFile(@RequestParam("file") MultipartFile file) {
// 获取文件名和路径
String fileName = file.getOriginalFilename();
Path path = Paths.get(UPLOAD_DIR + fileName);
// 存储文件到指定路径
try {
Files.copy(file.getInputStream(), path, StandardCopyOption.REPLACE_EXISTING);
return ResponseEntity.ok("File uploaded successfully: " + fileName);
} catch (IOException e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body("Error uploading file: " + e.getMessage());
}
}
// 文件下载接口
@GetMapping("/download/{fileName}")
public ResponseEntity<Resource> downloadFile(@PathVariable String fileName) {
Path filePath = Paths.get(UPLOAD_DIR + fileName);
Resource resource = new FileSystemResource(filePath.toFile());
if (!resource.exists()) {
return ResponseEntity.status(HttpStatus.NOT_FOUND).body(null);
}
// 返回文件流
return ResponseEntity.ok()
.contentType(MediaType.APPLICATION_OCTET_STREAM)
.body(resource);
}
}
代码解析:
- 文件上传接口:
@RequestParam("file")
用来接收上传的文件,MultipartFile
表示上传的文件对象。通过file.getInputStream()
获取文件的输入流,使用Files.copy()
将文件内容存储到本地的指定路径。 - 文件下载接口:
@PathVariable
获取请求路径中的文件名,并通过ResponseEntity
返回文件内容。在这里,返回的是文件流,以便客户端进行下载。
文件上传与下载请求示例:
- 上传文件:发送
POST
请求到/file/upload
,并在请求中附带文件。 - 下载文件:发送
GET
请求到/file/download/{fileName}
,根据文件名下载文件。
进阶配置:文件大小限制
当文件上传时,通常需要限制文件大小以避免上传过大的文件影响系统性能。在 application.properties
中,我们可以通过以下配置来限制上传文件的大小:
spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=10MB
这些设置将限制每个文件的最大上传大小为 10MB。
📂 基于 Spring Boot 的多文件上传与进度显示
在许多应用场景中,用户可能需要上传多个文件。Spring Boot 允许我们同时接收多个文件,通过 List<MultipartFile>
来接收多个文件上传。除此之外,用户还可能希望查看上传的进度,特别是上传较大文件时。这里,我们将讨论如何实现多文件上传并显示上传进度。
多文件上传实现
Spring Boot 默认支持多文件上传,只需将 @RequestParam
注解的类型改为 List<MultipartFile>
即可。
多文件上传控制器
@PostMapping("/uploadMultiple")
public ResponseEntity<String> uploadMultipleFiles(@RequestParam("files") List<MultipartFile> files) {
StringBuilder fileNames = new StringBuilder();
// 处理每个文件
for (MultipartFile file : files) {
String fileName = file.getOriginalFilename();
Path path = Paths.get(UPLOAD_DIR + fileName);
try {
Files.copy(file.getInputStream(), path, StandardCopyOption.REPLACE_EXISTING);
fileNames.append(fileName).append(" ");
} catch (IOException e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body("Error uploading files: " + e.getMessage());
}
}
return ResponseEntity.ok("Files uploaded successfully: " + fileNames.toString());
}
代码解析:
- 接收多个文件:使用
List<MultipartFile>
来接收多个文件。 - 处理文件:通过
Files.copy()
方法将文件存储在指定位置。
多文件上传请求示例:
发送 POST
请求到 /file/uploadMultiple
,并附带多个文件。
文件上传进度显示
在文件上传过程中,特别是当文件较大时,用户可能希望看到上传的进度。我们可以通过前端与后端配合来实现进度条显示。前端可以通过 XMLHttpRequest
监听上传的进度,并通过 JavaScript 动态更新进度条。
前端实现上传进度显示
var formData = new FormData();
formData.append("files", fileInput.files[0]);
var xhr = new XMLHttpRequest();
xhr.open("POST", "/file/uploadMultiple", true);
// 监听上传进度
xhr.upload.addEventListener("progress", function (e) {
if (e.lengthComputable) {
var percent = (e.loaded / e.total) * 100;
console.log("Progress: " + percent + "%");
document.getElementById("progress-bar").style.width = percent + "%";
}
});
// 上传完成后的处理
xhr.onload = function () {
if (xhr.status == 200) {
alert("Files uploaded successfully!");
} else {
alert("Error uploading files.");
}
};
xhr.send(formData);
代码解析:
- XMLHttpRequest:前端使用
XMLHttpRequest
来处理文件上传,并通过upload.addEventListener
监听文件上传进度。 - 进度条更新:通过
e.loaded
和e.total
计算上传进度,并动态更新进度条显示。
上传进度的工作原理:
- 使用
XMLHttpRequest
监听progress
事件来获取文件上传的进度信息。 - 通过 JavaScript 动态更新进度条(例如,使用
document.getElementById("progress-bar").style.width
)。
☁️ Spring Boot 与文件存储服务(如 AWS S3)的集成
随着云存储的普及,许多现代应用将文件存储从本地转移到云端,AWS S3 是最常见的云存储服务之一。通过与 AWS S3 集成,我们可以更方便地管理大量文件,同时获得更高的可靠性和扩展性。
配置 AWS S3 集成
1. 添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-aws</artifactId>
</dependency>
2. 配置 AWS 凭证与 S3 存储桶
在 application.properties
中配置 AWS 的访问密钥和存储桶名称:
cloud.aws.credentials.access-key=YOUR_ACCESS_KEY
cloud.aws.credentials.secret-key=YOUR_SECRET_KEY
cloud.aws.region.static=us-east-1
cloud.aws.s3.bucket=your-bucket-name
3. 上传文件到 S3
@Service
public class S3Service {
@Autowired
private AmazonS3 amazonS3;
@Value("${cloud.aws.s3.bucket}")
private String bucketName;
public void uploadFile(MultipartFile file) {
try {
// 获取文件名
String fileName = file.getOriginalFilename();
// 将文件上传到 S3
amazonS3.putObject(new PutObjectRequest(bucketName, fileName, file.getInputStream(), new ObjectMetadata()));
System.out.println("File uploaded to S3: " + fileName);
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException("Error uploading file to S3");
}
}
}
代码解析:
- 上传文件到 S3:通过
amazonS3.putObject()
方法将文件上传到 AWS S3 存储桶。 - 处理文件流:通过
file.getInputStream()
获取文件输入流,上传到 S3。
4. 从 S3 下载文件
@GetMapping("/downloadFromS3/{fileName}")
public ResponseEntity<Resource> downloadFileFromS3(@PathVariable String fileName) {
S3Object s3Object = amazonS3.getObject(new GetObjectRequest(bucketName, fileName));
InputStreamResource resource = new InputStreamResource(s3Object.getObjectContent());
return ResponseEntity.ok()
.contentType(MediaType.APPLICATION_OCTET_STREAM)
.body(resource);
}
代码解析:
- 下载文件:使用
amazonS3.getObject()
从 S3 获取文件对象,并返回InputStreamResource
供用户下载。
AWS S3 的优势
- 高可用性:AWS S3 提供高可用、冗余的存储解决方案,确保数据不会丢失。
- 弹性扩展:支持存储超大文件和海量数据,能够根据需求自动扩展。
- 全球分布:S3 在全球各地部署数据中心,用户可以快速访问存储的文件。
📌 小结
通过 Spring Boot 实现文件上传、下载以及进度显示,可以为用户提供丰富的文件处理功能。多文件上传和进度显示功能特别适用于处理大量数据或大文件的应用。而结合云存储服务如 AWS S3,则可以帮助我们更高效、灵活地管理文件,避免了本地存储的限制与管理问题。
希望本文的内容能够帮助你掌握文件上传与存储的实现方法,并灵活应用于实际项目中。无论是处理单个文件、多文件上传,还是与云存储服务的集成,Spring Boot 都提供了强大的支持,使得开发者能够轻松应对复杂的文件处理需求。
🧧福利赠与你🧧
无论你是计算机专业的学生,还是对编程有兴趣的小伙伴,都建议直接毫无顾忌的学习此专栏「滚雪球学SpringBoot」专栏(全网一个名),bug菌郑重承诺,凡是学习此专栏的同学,均能获取到所需的知识和技能,全网最快速入门SpringBoot,就像滚雪球一样,越滚越大, 无边无际,指数级提升。
最后,如果这篇文章对你有所帮助,帮忙给作者来个一键三连,关注、点赞、收藏,您的支持就是我坚持写作最大的动力。
同时欢迎大家关注公众号:「猿圈奇妙屋」 ,以便学习更多同类型的技术文章,免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板、技术文章Markdown文档等海量资料。
✨️ Who am I?
我是bug菌(全网一个名),CSDN | 掘金 | InfoQ | 51CTO | 华为云 | 阿里云 | 腾讯云 等社区博客专家,C站博客之星Top30,华为云多年度十佳博主/价值贡献奖,掘金多年度人气作者Top40,掘金等各大社区平台签约作者,51CTO年度博主Top12,掘金/InfoQ/51CTO等社区优质创作者;全网粉丝合计 30w+;更多精彩福利点击这里;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试真题、4000G PDF电子书籍、简历模板等海量资料,你想要的我都有,关键是你不来拿。

-End-
- 点赞
- 收藏
- 关注作者
评论(0)