大文件传输系统设计

大文件传输系统的整体架构、前后端分工、接口设计与落地路径

#type / synthesis #status / evergreen #tech / dev / frontend #tech / dev / backend

[!info] related notes

大文件传输系统设计

范围

本文串联大文件传输的各个原子概念,解释它们之间的关系、依赖路径和整体架构设计。

为什么要放在一起理解

大文件传输不是单一技术点,而是一个分布式任务协作系统

  • 前端在拆任务和调度任务
  • 后端在记录任务和收集任务结果
  • 存储在承载任务产物
  • 最后再把这些结果组装成一个完整文件

只有理解整体架构,才能做出正确的技术选型和接口设计。

关系与依赖

核心概念依赖路径

[[large-file-upload-overview|大文件传输概述]]
    ├─ 前端侧:[[frontend-file-chunk-upload|前端切片与并发控制]]
    │   ├─ [[frontend-hash-calculation-strategy|前端哈希计算策略]]
    │   └─ [[resumable-upload-mechanism|断点续传机制]](前端部分)

    ├─ 后端侧:[[backend-upload-state-management|后端状态管理与分块合并]]
    │   ├─ [[instant-upload-mechanism|秒传机制]]
    │   └─ [[file-integrity-verification|完整性校验]]

    ├─ 下载侧:[[large-file-download-range-request|大文件下载与 Range 请求]]

    └─ 工程实践:[[large-file-upload-engineering-challenges|工程难点与最佳实践]]

前后端协作协议

关键约定:

  • chunk 编号规则必须统一(从 0 还是 1 开始)
  • 重复 chunk 如何处理(幂等性)
  • 失败码要有区分(便于前端做不同恢复策略)
  • 上传完成的语义要明确(收到 vs 合并校验通过)

典型接口设计

接口作用
POST /upload/init创建任务,判断秒传,返回配置
POST /upload/chunk上传单个 chunk(幂等)
GET /upload/status查询已上传 chunk 列表
POST /upload/complete触发合并与校验
POST /upload/cancel取消任务,清理临时数据

对比与易混淆点

分块上传 vs 断点续传

分块上传断点续传
关系基础能力在分块基础上的状态恢复
依赖依赖分块上传
目的解决大文件传输稳定性解决中断后继续上传

秒传 vs 断点续传

秒传断点续传
触发条件文件 hash 已存在上传中断后恢复
传输量0剩余未上传部分
依赖hash 去重状态记录

前端直传 vs 后端中转

前端直传对象存储后端中转
带宽压力分散到存储服务集中在业务服务
复杂度需要签名/凭证管理简单但扩展性差
适用场景大流量、高并发小规模、快速实现

落地路径

第一阶段:基础可用

  • 分块上传
  • 并发控制
  • 合并接口
  • 上传状态记录

第二阶段:提升稳定性

  • 断点续传
  • 单 chunk 重试
  • 幂等处理
  • 临时文件清理

第三阶段:提升体验和性能

  • 秒传
  • Web Worker 哈希
  • 直传对象存储
  • 异步合并
  • 更精细的进度条

工具选型参考

前端上传框架

  • Uppy:模块化、可扩展的 JavaScript 文件上传器,提供现成 UI 和插件系统
    • 适合:需要快速搭建前端上传页面,需要现成 UI 组件
    • 可接:tus、XHR、S3 Multipart 等多种后端

断点续传协议

  • tus 协议:基于 HTTP 的可恢复上传开放协议
    • 适合:需要严格的断点续传能力,需要前后端统一协议标准
    • 实现:tus-js-client(JS 客户端)、tusd(Go 服务端)

常见组合

  1. Uppy + tus:前端用 Uppy,底层用 tus 协议实现断点续传
  2. 单独使用 Uppy:用 XHR 或 S3 Multipart,不需要严格断点续传
  3. 单独使用 tus:自己写前端,但用 tus-js-client 实现断点续传
创建于 2026/3/28 更新于 2026/5/27