根本问题在于传输稳定性、速度与可控性,需通过分片(2–5mb)、合理并发(3–4)、服务端状态协同实现;分片用file.slice避免内存占用,每片携带文件md5+序号,支持断点续传与单片重试。

大文件上传卡顿、中断重传耗时长、用户等待焦虑——根本问题不在“传不传得上去”,而在“怎么传得稳、传得快、传得可控”。并行传输不是简单开多个请求,而是前端调度、服务端配合、网络与资源平衡的结果。关键在分片 + 并发 + 状态可控,三者缺一不可。
分片是并行的前提,不是可选项
直接传整个 File 对象会把全部内容读进内存,GB 级文件极易触发浏览器卡死或崩溃。必须用 File.slice(start, end) 按字节切块(如每片 2–5 MB),它不复制数据、不占额外内存,只生成轻量 Blob 引用。
- 切片大小建议设为 2–5 MB:太小增加 HTTP 开销,太大削弱并发收益和失败重试粒度
- 每片需携带唯一标识:推荐用文件整体 MD5 + 分片序号(chunkIndex),便于服务端归集和秒传判断
- 避免提前调用
file.arrayBuffer()或file.text(),这些同步读取会阻塞主线程
并发控制要“有数”而非“越多越好”
盲目开启 10 个并发,可能被浏览器限制(Chrome 默认约 6 个同域连接)、压垮服务端、甚至拖慢单个请求速度。合理并发数通常为 3–4,靠队列+计数器动态调度。
如果你了解HTML,CSS和JavaScript,您已经拥有所需的工具开发Android应用程序。本动手本书展示了如何使用这些开源web标准设计和建造,可适应任何Android设备的应用程序 - 无需使用Java。您将学习如何创建一个在您选择的平台的Android友好的网络应用程序,然后转换与自由PhoneGap框架到一个原生的Android应用程序。了解为什么设备无关的移动应用是未来的潮流,并开始构建应用程序,提供更
- 维护一个待上传切片队列和当前活跃数(
activeCount),每次仅当activeCount 才启动新请求 - 每个请求完成(success/error)后,立即
activeCount--并尝试从队列取下一个切片 - 可用
Promise.allSettled(chunks.map(uploadChunk))封装一批,但需配合节流逻辑,避免一次性全发
并行上传必须配套断点与重试机制
并发下某一片失败,不能整批回滚或暂停所有任务。要支持单片级重试、跳过已成功项、进度可恢复。
- 上传前先向服务端查询该文件 MD5 对应的已上传切片列表,前端过滤掉已成功的索引
- 单个切片请求失败(如 500、超时、网络中断),只重发该片,不干扰其他并发任务
- 记录每个切片的起始偏移、大小、状态(pending/success/failed),UI 可显示各片独立进度条
超大文件(≥10 GB)可考虑流式上传替代分片
当文件极大且浏览器支持较新(Chrome/Edge ≥109),fetch + ReadableStream 比分片更底层、内存更友好:它边读边发,无峰值内存压力。
- 用
file.stream().getReader()分次读取Uint8Array片段 - 每次 fetch 需手动设置
Content-Range头(如bytes 0-1048575/1073741824),服务端据此写入对应位置 - Safari 和旧版 Firefox 不支持,需降级到分片方案,可用
if ('ReadableStream' in window)判断
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










