大文件传输概述
大文件传输的本质问题与分块上传架构概述
#type / concept
#status / evergreen
#tech / dev / frontend
#tech / dev / backend
[!info] related notes
- 所属 MOC: 前端工程化 MOC
- 前置概念: HTTP
- 并列概念: 前端切片与并发控制, 后端状态管理与分块合并
- 关系笔记: 大文件传输系统设计
大文件传输概述
一句话定义
大文件传输是将传统单次 HTTP 上传拆解为分块上传 + 状态管理 + 校验合并 + 错误恢复的系统性问题,目标是实现稳定、可恢复、可扩展的文件传输。
核心内容
传统上传方式的问题
单次 POST 上传大文件(如 5GB)会踩中多个坑:
- 请求生命周期太长:浏览器、网关、Nginx、应用服务器、负载均衡都可能超时
- 重试成本太高:传到 4.8GB 断了,只能从 0 重新开始
- 服务器压力大:磁盘临时文件占满、内存升高、线程长期占用
- 无法做高级能力:断点续传、秒传、暂停继续、多线程并发都做不了
分块上传架构
最经典方案:前端切片 + 后端记录状态 + 分块上传 + 服务端合并
完整链路:
- 前端选择文件,计算文件信息(文件名、大小、类型、哈希)
- 前端调用”初始化上传”接口,获取
uploadId - 后端返回
uploadId、分块大小、已上传分块列表 - 前端把文件切成多个 chunk
- 前端并发上传每个 chunk
- 后端保存 chunk,记录上传状态
- 所有 chunk 完成后,前端调用”合并”接口
- 后端按顺序合并 chunk,做完整性校验
- 返回最终文件地址或文件 ID
适用场景
- Web 端上传视频、安装包、压缩包
- App 上传录音、影像、日志
- 管理后台上传数据备份
- 企业网盘、知识库、素材平台
边界与易混淆点
- 分块上传 ≠ 断点续传:分块是基础能力,断点续传是在分块基础上的状态恢复
- 秒传 ≠ 文件名相同:秒传依赖内容哈希去重,不是文件名匹配
- 进度条 ≠ 上传字节:完整进度应包含服务端合并与校验阶段(0-95% 上传 chunk,95-100% 服务端处理)