1. 为什么需要大文件分片上传与断点续传
在开发文件上传功能时,小文件上传通常不会遇到太多问题。但当文件体积达到GB级别时,传统的单次上传方式就会暴露出诸多问题。我曾经在一个视频处理项目中遇到过这样的情况:用户上传2GB的视频文件,上传到90%时网络波动导致失败,用户不得不重新上传整个文件,体验极差。
分片上传的核心思想是将大文件切割成多个小块(比如每块5MB),然后逐个上传这些小块。这样做有几个明显优势:
- 网络中断可恢复:即使某个分片上传失败,只需要重传这个分片,而不是整个文件
- 并行上传加速:可以同时上传多个分片,充分利用带宽
- 内存压力小:每次只处理一个小分片,避免大文件占用过多内存
- 进度可控:可以精确显示每个分片的上传进度
MinIO作为高性能的对象存储服务,原生支持分片上传和断点续传功能。结合Spring Boot,我们可以轻松实现这一功能架构。
2. 环境准备与MinIO部署
2.1 MinIO服务部署
推荐使用Docker快速部署MinIO服务,这是最便捷的方式:
docker run -d -p 9000:9000 -p 9001:9001 \
-e "MINIO_ROOT_USER=myadmin" \
-e "MINIO_ROOT_PASSWORD=mypassword" \
-v /data/minio:/data \
--name minio \
minio/minio server /data --console-address ":9001"
这里有几个关键参数需要注意:
9000端口是API端口,Java客户端通过这个端口连接9001端口是控制台端口,可以通过浏览器访问- 挂载了本地目录
/data/minio用于持久化存储 - 设置了管理员账号密码(生产环境要使用更复杂的密码)
部署完成后,访问http://服务器IP:9001可以进入管理控制台。首次登录后,建议创建一个专门用于文件上传的存储桶(Bucket),比如命名为file-uploads。
2.2 Spring Boot项目初始化
创建一个新的Spring Boot项目,添加以下核心依赖:
<dependencies>
<!-- Spring Web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- MinIO SDK -->
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.5.5</version>
</dependency>
<!-- Lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
在application.yml中配置MinIO连接信息:
minio:
endpoint: http://localhost:9000
ac


被折叠的 条评论
为什么被折叠?



