跳过到内容

文件存储技术方案

更新时间:2025/7/4
文章字数:0
阅读时长:0 分钟

需求分析

系统设计

文件存储

文件上传流程

  • ✅ 秒传(基于文件 Hash 判断是否已上传)
  • ✅ 分片上传 + 并发控制
  • ✅ 上传完成后触发异步处理任务(缩略图、病毒扫描、敏感词检测、存储等)
  • ✅ 后台定时任务对未完成任务进行补偿

用户体验(Web 前端)

  1. 文件选择与预处理
    • 支持拖拽上传、粘贴上传、移动端兼容
    • 获取文件基本信息(name、size、type)
    • 文件类型白名单限制(如:隐藏文件、系统文件、屏蔽文件等)
  2. 客户端计算哈希
    • 计算文件的哈希(MD5/SHA1/SHA256)
  3. 上传初始化
    • 请求:POST /api/upload/init
    • 参数:文件路径、文件大小、文件哈希
    • 响应:
      • uploaderId:用于后续分片上传
      • chunkSize:建议分片大小
      • maxConcurrent:建议并发数
      • isSame:秒传校验结果,true 表示秒传成功,无需继续上传
  4. 分片处理
    • 前端根据 chunkSize 分片文件
    • 计算每片的哈希(MD5/SHA1/SHA256)
  5. 检查文件块是否已存在
    • 请求:POST /api/upload/block/check
    • 参数:uploaderIdchunkIndexchunkHash
    • 响应:missingChunks:缺失的分片索引列表
  6. 分片并发上传
    • 并发数:建议 maxConcurrent 个分片同时上传
    • 失败重试:每个分片最多重试 3 次
  7. 上传完成提示
    • 上传成功:前端收到上传完成响应后,即刻提示用户成功
    • 上传失败:前端根据重试次数,展示不同的失败提示

后端处理流程

  1. 上传初始化
    • 用户鉴权 + 上传权限校验
    • 当前存储空间是否足够
    • 同一 hash 是否已有上传任务,防并发上传(基于 hash 加锁)
    • 根据文件 Hash 检查是否存在相同哈希的文件,如果存在则不需要再次上传。
  2. 分片并发上传
    • 后端校验分片编号、Hash,写入临时目录
    • 支持幂等设计,保证重复请求仅处理一次
  3. 上传完成通知
    • 合并所有 chunk 为完整文件,校验文件 Hash 与前端提供的一致
    • 生成文件唯一 ID(如:UUID),并写入正式存储路径
    • 记录文件元数据(大小、类型、Hash 等),以备后续查询
  4. 异步处理任务
    • 触发异步任务处理(如:生成缩略图、扫描文件内容)
  5. 用户查询文件
    • 前端请求 /api/file/{fileUrl} 接口,查询文件元数据
    • 后端校验 fileUrl 地址的有效性,返回文件信息(大小、类型、Hash 等)