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

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










