大文件切片上传需先按固定大小切分为多个blob片段并发上传,服务端按序合并并支持断点续传;前端用File.slice()切片、Promise.allSettled()或并发池控制请求数量,每片携带fileHash与索引标识,上传前校验已传分片,失败可重试且不影响其他分片,全部成功后发起幂等合并请求。

大文件切片上传的核心思路
大文件不能直接一次性上传,需先按固定大小(如 5MB)切分成多个 blob 片段,再并发发送这些片段。服务端需能接收并按序合并,同时支持断点续传——关键在于每个分片携带唯一标识(如文件 hash + 分片索引),服务端据此校验、去重、拼接。
前端切片与并发控制实现
使用 File.prototype.slice() 切片,用 Promise.allSettled() 或自定义并发池控制请求数量,避免浏览器连接数超限或服务端压力过大:
- 计算总分片数:
Math.ceil(file.size / chunkSize) - 为每片生成唯一标识:
${fileHash}-${index}(推荐在上传前预计算整个文件的 md5/sha1,可用spark-md5等库流式计算) - 限制并发数(如 3~5 个):用队列 + 递归调用或
async-pool库,不直接用Promise.all,防止失败时全部重试 - 每个请求携带必要元数据:
filename、fileHash、chunkIndex、totalChunks、chunkHash(可选,用于分片级校验)
上传状态管理与断点续传
上传前先向服务端发起「检查已上传分片」请求(传 fileHash),服务端返回已成功接收的 chunkIndex 列表,前端跳过这些分片,只上传缺失部分:
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
- 本地缓存上传进度(如 localStorage 或 IndexedDB),记录
fileHash → [0,2,4]表示第 0/2/4 片已成功 - 用户暂停后恢复时,读取缓存 + 服务端比对,精准续传
- 单个分片失败应重试(建议 2~3 次),失败后记录错误,不影响其他分片;全部完成后才触发合并请求
合并与完成处理
所有分片上传成功后,前端发起合并请求(如 POST /api/merge),传入 fileHash 和原始文件名。服务端校验所有分片是否存在、顺序是否完整,无误后执行合并(如 Node.js 中用 fs.appendFile 拼接,或用 stream 合并)并清理临时分片:
立即学习“Java免费学习笔记(深入)”;
- 合并接口应幂等:重复调用不应出错,可返回已合并的文件 URL
- 前端收到合并成功响应后,清除本地缓存进度,更新 UI
- 若合并失败(如缺片、校验不通过),服务端返回具体缺失索引,前端可针对性补传

















