spring boot实现分片上传与断点续传的核心是“大文件拆小、状态可查、失败可续”:提供/upload/init、/upload/chunk、/upload/merge三个rest端点;用redis持久化uploadid对应的状态(含已传分片列表);分片直写临时目录、合并时流式追加并校验md5;同步调大spring boot multipart及nginx超时与体长限制。

Spring Boot 实现 REST 接口的文件分片上传与断点续传,核心是把“大文件拆小、状态可查、失败可续”三件事做扎实。不靠黑盒组件,用标准 Spring Web + Redis + 本地/分布式存储就能落地,重点在于前后端约定清晰、服务端状态管理可靠。
分片上传接口设计要简洁明确
服务端至少提供三个基础 REST 端点,路径和职责需一目了然:
- /upload/init:初始化上传。接收文件名、总大小、文件唯一标识(推荐用 MD5 或 SHA-256),返回 uploadId 和已上传分片列表(用于断点续传)
-
/upload/chunk:上传单个分片。必须携带 uploadId、当前分片序号(chunkIndex,建议从 0 开始)、总分片数(totalChunks)、该分片的校验值(如 partMd5),并以
MultipartFile形式提交二进制内容 - /upload/merge:合并所有分片。客户端确认全部分片就绪后调用,传入 uploadId 和完整文件 MD5,服务端校验后拼接、保存、清理临时文件
服务端状态必须持久化且可查询
断点续传的前提是“知道哪些传过了”。不能只靠内存或临时变量,推荐用 Redis 存储上传上下文:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- Key 使用
upload:{uploadId},设置 24 小时过期 - Hash 结构存字段:
file_size、total_chunks、uploaded_chunks(JSON 数组,如[0,1,3,5])、file_md5 - 每次成功上传分片后,用
HSET更新uploaded_chunks,并用EXPIRE延长过期时间 - 前端调用
/upload/init时,先查 Redis;存在即走续传流程,直接返回已传分片索引
分片处理与合并要安全高效
避免一次性加载整个文件,每个环节都面向“流”和“块”:
- 接收分片时,用
transferTo()直接写入临时目录(如/tmp/chunks/{uploadId}/{chunkIndex}),不进 JVM 堆 - 合并前,按序号读取所有分片文件,用
RandomAccessFile或Files.write(..., StandardOpenOption.APPEND)追加写入目标文件 - 合并完成后,校验最终文件的 MD5 是否与初始一致;校验失败则删除目标文件,返回错误
- 无论成功失败,都要清理对应 uploadId 下的所有临时分片文件
配套配置和边界防护不能少
Spring Boot 默认限制会卡住分片上传,Nginx 层也容易拦截大请求:
- 在
application.yml中调大 multipart 配置:
spring.servlet.multipart.max-file-size: 10MB
spring.servlet.multipart.max-request-size: 1000MB - Nginx 需同步调整:
client_max_body_size 2048m;
proxy_read_timeout 3600;
proxy_send_timeout 3600; - 每个分片上传接口要校验
partMd5,防止篡改或脏数据;对重复上传同一分片做幂等处理(跳过写入)










