文件存储技术方案
需求分析
系统设计
文件存储
文件上传流程
- ✅ 秒传(基于文件 Hash 判断是否已上传)
- ✅ 分片上传 + 并发控制
- ✅ 上传完成后触发异步处理任务(缩略图、病毒扫描、敏感词检测、存储等)
- ✅ 后台定时任务对未完成任务进行补偿
用户体验(Web 前端)
- 文件选择与预处理
- 支持拖拽上传、粘贴上传、移动端兼容
- 获取文件基本信息(name、size、type)
- 文件类型白名单限制(如:隐藏文件、系统文件、屏蔽文件等)
- 客户端计算哈希
- 计算文件的哈希(MD5/SHA1/SHA256)
- 上传初始化
- 请求:
POST /api/upload/init - 参数:文件路径、文件大小、文件哈希
- 响应:
uploaderId:用于后续分片上传chunkSize:建议分片大小maxConcurrent:建议并发数isSame:秒传校验结果,true表示秒传成功,无需继续上传
- 请求:
- 分片处理
- 前端根据
chunkSize分片文件 - 计算每片的哈希(MD5/SHA1/SHA256)
- 前端根据
- 检查文件块是否已存在
- 请求:
POST /api/upload/block/check - 参数:
uploaderId、chunkIndex、chunkHash - 响应:
missingChunks:缺失的分片索引列表
- 请求:
- 分片并发上传
- 并发数:建议
maxConcurrent个分片同时上传 - 失败重试:每个分片最多重试 3 次
- 并发数:建议
- 上传完成提示
- 上传成功:前端收到上传完成响应后,即刻提示用户成功
- 上传失败:前端根据重试次数,展示不同的失败提示
后端处理流程
- 上传初始化
- 用户鉴权 + 上传权限校验
- 当前存储空间是否足够
- 同一 hash 是否已有上传任务,防并发上传(基于 hash 加锁)
- 根据文件 Hash 检查是否存在相同哈希的文件,如果存在则不需要再次上传。
- 分片并发上传
- 后端校验分片编号、Hash,写入临时目录
- 支持幂等设计,保证重复请求仅处理一次
- 上传完成通知
- 合并所有 chunk 为完整文件,校验文件 Hash 与前端提供的一致
- 生成文件唯一 ID(如:UUID),并写入正式存储路径
- 记录文件元数据(大小、类型、Hash 等),以备后续查询
- 异步处理任务
- 触发异步任务处理(如:生成缩略图、扫描文件内容)
- 用户查询文件
- 前端请求
/api/file/{fileUrl}接口,查询文件元数据 - 后端校验
fileUrl地址的有效性,返回文件信息(大小、类型、Hash 等)
- 前端请求