完整性校验
大文件上传的完整性校验策略,包括 chunk 级和文件级哈希校验
#type / concept
#status / evergreen
#tech / dev / frontend
#tech / dev / backend
[!info] related notes
完整性校验
一句话定义
完整性校验是在分块上传的每个环节(chunk 上传、chunk 合并后)通过哈希比对确保文件内容未损坏。
核心内容
校验层次
| 层次 | 校验对象 | 目的 |
|---|---|---|
| chunk 级 | 单个分块 | 确保每个分块传输正确 |
| 文件级 | 合并后完整文件 | 确保合并结果与原始文件一致 |
chunk 级校验
前端上传每个 chunk 时可携带 chunkHash:
{
"uploadId": "u_123",
"chunkIndex": 5,
"chunkHash": "abc123..."
}
后端收到后计算实际 hash 并比对,不一致则返回错误。
文件级校验
合并完成后,后端计算最终文件 hash:
- 前端初始化时传入
fileHash - 后端合并所有 chunk
- 计算合并后文件的 hash
- 比对是否与
fileHash一致 - 一致则标记任务完成,不一致则标记失败
常用哈希算法
- MD5:速度快,但安全性较弱,适合内部校验
- SHA-256:安全性强,适合生产环境
- CRC32:速度极快,适合 chunk 级快速校验
校验失败处理
- chunk 级失败:通知前端重传该 chunk
- 文件级失败:保留状态以便排查,可重试合并或标记任务失败
边界与易混淆点
- 不能只相信”所有 chunk 都上传完了”:必须做最终 hash 校验
- 校验成本:大文件全量 hash 计算耗时,可考虑抽样校验或增量 hash
- 网络传输校验 vs 存储校验:TCP 已有校验,但应用层校验仍是必要的(防止存储介质错误)