java实现大文件分片上传与断点续传的核心在于前端分片+后端校验合并+服务端记录上传状态;前端用file.slice()切片并携带fileid、chunkindex等元信息,后端通过redis记录分片状态、校验md5、支持断点查询与并发安全合并。

Java 实现大文件分片上传与断点续传,核心在于**前端分片 + 后端校验合并 + 服务端记录上传状态**。关键不是单纯“传完再拼”,而是让每次请求可独立、可重试、可校验、可恢复。
一、前端按固定大小切片并携带元信息
浏览器使用 File.slice()(或 blob.slice())将文件切为固定大小块(如 2MB/片),每片上传时附带:
- fileId:全局唯一标识(如 UUID 或文件 hash 前缀),用于关联同一文件的所有分片
- chunkIndex:当前分片序号(从 0 或 1 开始,需前后端约定)
- totalChunks:总分片数
- fileName 和 fileSize(可选,用于服务端校验)
- md5(或 sha256):单片 hash,用于后端校验完整性(强烈建议)
注意:避免用时间戳或随机数作为 fileId,否则断点续传时无法识别原文件。
二、后端接收分片并持久化上传进度
每个分片上传接口(如 POST /upload/chunk)需完成三件事:
- 校验
fileId + chunkIndex是否已存在(防止重复提交) - 比对客户端传来的分片 md5 与服务端计算的 md5,不一致则返回错误
- 将分片二进制数据存为临时文件(如
/tmp/{fileId}_{chunkIndex}.part),同时在数据库或 Redis 中记录该分片状态:
{"fileId": "abc123", "chunkIndex": 5, "status": "success", "uploadedAt": "2024-06-10T14:22:00Z"}
推荐用 Redis 存储进度(高性能、支持过期),结构可用 Hash:HSET upload_progress:abc123 5 success,再用 HEXISTS 快速判断某片是否已传。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
三、上传前先查已传分片,实现断点续传
用户再次上传同一文件(相同 fileId)时,前端应先发请求(如 GET /upload/progress?fileId=abc123)拉取已成功上传的分片索引列表。后端返回类似:
前端据此跳过已传分片,只上传缺失的 [3,4,7,8,9]。若文件名或大小变更,可通过完整文件 hash(如 MD5 of whole file)做二次确认,避免同 fileId 不同文件的误续传。
四、所有分片上传完成后触发合并与清理
前端检测到所有分片返回成功后,调用合并接口(如 POST /upload/merge),传入 fileId。后端执行:
- 校验 Redis 中
uploadedChunks数量是否等于totalChunks - 按序读取所有
.part文件,用Files.copy()或 NIOChannel追加写入目标文件(避免全加载内存) - 合并后计算最终文件 hash,与前端预传的 totalMd5 比对(防合并出错)
- 合并成功则删除所有 .part 临时文件,并清除 Redis 中的进度记录
合并过程建议异步处理(如交由线程池或消息队列),避免 HTTP 请求超时;同时加分布式锁(如 Redis Lock)防止同一 fileId 被多次合并。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










