javascript断点续传切片上传器采用面向对象设计,核心包括uploadtask(封装切片任务、重试、唯一id)、sliceuploader(统筹分片、进度持久化、合并触发)及服务端协同校验,支持web worker预计算哈希、beforeunload进度保存与幂等接口。

JavaScript 实现支持断点续传的文件切片上传器,核心在于将大文件分块、记录已上传块、服务端配合校验与合并。面向对象设计能清晰划分职责:文件管理、切片控制、上传调度、状态持久化、错误恢复。下面是一个轻量但完整可用的实现思路和关键代码结构。
1. 定义 UploadTask 类封装单次上传任务
每个切片视为一个独立任务,包含文件、起始偏移、长度、唯一标识(如 hash + index)、重试逻辑等。
- 使用 Blob.slice() 提取指定范围字节,避免内存爆炸
- 上传前生成块唯一 ID(推荐用文件 hash + 分片索引,如
fileHash_0005),便于服务端去重与校验 - 内置失败自动重试(带指数退避),并暴露
abort()、resume()接口
2. 构建 SliceUploader 管理器类统筹流程
它不直接操作网络,而是协调切片生成、任务队列、状态同步、进度通知和最终合并触发。
- 初始化时读取文件并计算总分片数(例如每片 512KB);同时尝试从 localStorage 或 IndexedDB 加载已上传的 chunk IDs 列表
- 提供
start()方法:过滤出未上传的切片,按并发数(如 3)启动任务,使用 Promise.allSettled 控制批次 - 每个成功上传后调用
saveProgress(chunkId)持久化状态;失败则标记并暂存,后续 resume 时跳过或重试 - 所有切片完成后,自动发起
/merge请求,携带 fileHash 和分片总数,由服务端校验并合成完整文件
3. 断点状态需客户端+服务端协同维护
纯前端无法可靠判断服务端是否真正写入成功,因此必须依赖服务端返回的“已存在”响应(如 HTTP 200 + {"exists": true})。
- 客户端每次上传前先发 HEAD 或 GET 请求询问该 chunk 是否已存在(URL 示例:
/upload/chunk?file=abc123&index=7) - 服务端根据存储路径或数据库记录返回存在状态;若存在,跳过上传,直接计入完成列表
- localStorage 存的是「已确认成功」的 chunk ID 列表,不是「已发起请求」——避免网络中断导致误判
4. 文件哈希预计算提升体验(可选但推荐)
为避免用户点击上传后才开始计算整个文件 hash(阻塞 UI),可在选择文件后用 Web Worker 异步计算 spark-md5 或 web-worker-hash。
- 主界面显示「正在准备…」状态,Worker 计算期间允许取消
- hash 用于生成文件唯一标识、服务端校验、断点续传上下文绑定
- 若用户中途关闭页面,下次打开时可通过 hash 查询服务端已有进度(需服务端支持 /status?fileHash=xxx 接口)
不复杂但容易忽略:上传过程需监听 beforeunload 保存当前进度,服务端接口要幂等(同一 chunk 多次上传应返回成功而非报错),合并阶段要有超时与回滚机制。面向对象的价值就体现在这里——把“切片”、“任务”、“进度”、“合并”拆成各自负责的类,改一处不影响全局。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











