ThinkPHP可手动实现断点续传:前端分片上传并记录状态,后端提供分片校验、接收与合并接口,按序拼接并校验完整性,结合数据库或Redis持久化上传状态并超时清理。

ThinkPHP 本身不内置断点续传功能,但可以通过结合 HTTP 协议规范(如 Range 请求头)、服务端分片校验与客户端配合,手动实现文件的断点续传。核心在于:**服务端能识别已上传部分、跳过重复内容、支持分块接收并最终合并**。
1. 前端需支持分片上传与断点记录
浏览器端不能直接用 input[type="file"] 一次性提交大文件。必须借助 JavaScript(如原生 File.slice() 或第三方库如 webuploader、axios 分片)将文件切片,并维护上传状态(如已传 chunk 列表、MD5 等)。
- 每个分片携带唯一标识(如
file_id+chunk_index+total_chunks) - 上传前先请求服务端检查哪些分片已存在(避免重复上传)
- 失败后可从断点继续,只重传未完成的分片
2. 后端需提供分片接收与校验接口
ThinkPHP 控制器中需实现两个关键接口:
-
检查已上传分片:接收
file_id和chunk_index,查询服务端是否已存该分片(例如检查uploads/{file_id}/chunk_0001是否存在) -
接收单个分片:接收分片数据(
$_FILES['chunk']或原始 body),保存为临时文件(如runtime/upload/chunks/{file_id}_{index}.part),并返回成功状态
建议对每个分片做简单校验(如大小匹配、MD5 比对),防止传输损坏。
立即学习“PHP免费学习笔记(深入)”;
3. 合并分片并校验完整性
当所有分片上传完成,前端触发合并请求。服务端按序读取所有 .part 文件,拼接写入目标文件:
- 按
chunk_index升序合并,确保顺序正确 - 合并后计算整个文件的 MD5/SHA256,与前端预计算的值比对,确认无损
- 校验通过后,清理临时分片目录,返回最终文件 URL 或 ID
示例伪代码(在 ThinkPHP 控制器中):
file_put_contents($final, file_get_contents($chunkPath), FILE_APPEND | LOCK_EX);4. 断点状态持久化与超时清理
上传过程可能中断,需记录中间状态,避免无限挂起:
- 用数据库或缓存(如 Redis)存储
file_id → {status: 'uploading', uploaded_chunks: [0,1,3], expire_time: ...} - 设置上传有效期(如 24 小时),超时自动清理临时分片和记录
- 提供“续传查询”接口,供前端恢复时拉取当前进度
不复杂但容易忽略。



















