秒传机制
基于文件哈希的内容去重实现秒传,避免重复上传相同文件
#type / concept
#status / evergreen
#tech / dev / backend
[!info] related notes
秒传机制
一句话定义
秒传是通过文件哈希判断内容是否已存在,如果存在则直接创建业务引用,不再要求上传内容。
核心内容
基本流程
- 前端把文件 hash 发给后端
- 后端查是否已有同 hash 的完整文件
- 如果有:直接创建业务引用,不再要求上传内容
- 返回”秒传成功”
关键点
秒传不是”文件名相同就跳过”,而是”内容相同”
必须依赖 hash 或其他强校验机制。
实现方式
很多系统还会做:
- 物理文件只存一份
- 多个业务记录引用同一底层文件对象
这就是内容去重。
前端初始化时的判断
调用 /upload/init 时,后端可以返回:
{
"uploadId": "u_123456",
"chunkSize": 10485760,
"uploadedChunks": [],
"needUpload": false,
"fileExists": true,
"fileId": "f_001"
}
如果 needUpload: false,前端直接完成,无需上传任何 chunk。
存储优化
- 同一文件只存一份物理副本
- 通过引用计数管理生命周期
- 节省存储空间和带宽
边界与易混淆点
- hash 碰撞风险:理论上不同内容可能产生相同 hash,生产中通常用 SHA-256 或更强算法
- hash 计算成本:大文件全量 hash 很慢,可先用抽样 hash 快速判断,后端再做严格校验
- 跨用户去重:需要考虑权限隔离,不能让用户 A 看到用户 B 的私有文件