这是 Beta 探索课程,内容结构、实验步骤和示例可能会继续调整。
状态查询与幂等设计
状态查询接口
断点续传需要一个查询接口:
GET /uploads/{upload_id}/parts
返回内容不是简单的百分比,而是已完成的分片编号列表。客户端根据这个列表跳过已上传分片,只补传缺失部分。
为什么是「分片列表」而不是「百分比」?因为百分比无法精确告诉客户端「从哪继续」——只有精确到分片编号,断点续传才可靠。
幂等设计
断点续传一定会遇到重复上传同一个分片(网络重试、浏览器重复提交、多页面并发)。服务端不能因为重复请求就报错,而要做幂等处理:
| 情况 | 处理 |
|---|---|
| 分片编号、大小、hash 一致 | 直接返回成功(视为已上传) |
| 分片编号一致但 hash 不一致 | 拒绝,并标记任务异常 |
| 任务已合并完成 | 返回最终文件信息,不再接收分片 |
状态机
上传任务的状态机要清晰,且允许从「任意中断点」恢复:
init -> uploading <--> paused/failed(可续传)
↓ 所有分片到齐
merging -> scanning -> available
- 中断 = 状态停在
uploading,分片部分完成。 - 恢复 = 查询已完成分片,继续传缺失部分。
- 合并 = 所有分片到齐后触发。
一致性:不能完全信任客户端
服务端虽然接收客户端的进度报告,但要以服务端实际记录为准:
- 客户端说「我传了 3 号分片」,服务端要能查到 3 号分片确实存在且 hash 一致。
- 数据不一致时,以服务端为准,要求客户端重传。
清理与过期
断点续传也依赖过期机制:
- 任务长期不续传(如 24 小时无新分片),自动标记失效并清理分片。
- 用户主动放弃时,清理接口删除任务和分片。
- 避免「永远传不完」的任务无限占用存储。
下一节看断点续传的产品体验——状态怎么呈现给用户,才是真的「好用」。
发现内容有问题?
告诉我们哪里需要改进。
