分片下载校验不一致时仅重试对应区块:按固定大小切分文件为range请求,每分片用唯一id标识并记录状态、起止位置及重试次数,请求前校验retrycount。

分片下载中校验不一致时重试,核心是:按块独立下载 + 单独校验 + 失败后仅重试对应区块,而非整个文件。关键在于维护每个分片的状态、校验逻辑与重试机制的解耦。
分片请求与状态管理
将文件按固定大小(如 1MB)切分为多个 Range 请求,每个分片用唯一 ID 标识,并记录其状态(pending / success / failed)和已尝试次数:
- 使用数组或 Map 存储分片元信息,例如:
{ id: 0, start: 0, end: 1048575, status: 'pending', retryCount: 0 } - 发起请求前检查
retryCount ,避免无限重试 - 推荐用
AbortController控制单个分片请求超时或取消
下载后校验与差异化处理
每个分片响应体需在前端计算校验值(如 SHA-256 或 MD5),并与服务端预置的分片摘要比对。注意:不能依赖 HTTP 响应头(如 ETag)做分片级校验,因其通常针对完整资源。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 服务端应提供分片摘要列表(如 JSON 数组),与分片顺序一一对应
- 前端用
SubtleCrypto.digest()计算 ArrayBuffer 的哈希值(注意:需将response.arrayBuffer()转为Uint8Array后传入) - 校验失败时,仅将该分片状态设为
failed,不清空已成功下载的其他分片数据
自动重试失败分片
校验完成后,扫描所有状态为 failed 的分片,触发重试。重试逻辑应支持退避策略,避免瞬时重压服务端:
- 简单线性退避:第 n 次重试前等待
n * 500ms - 使用
setTimeout+ Promise 封装延迟,配合async/await控制流程 - 重试时更新
retryCount,达到上限后标记为permanent_failed并记录错误原因 - 可并行重试多个失败分片(限制并发数,如最多 3 个),但需避免与主下载队列竞争连接数
合并与最终校验
所有分片(含重试成功的)下载并校验通过后,按顺序拼接为完整 ArrayBuffer。此时建议再做一次全量校验(如对比服务端提供的文件总哈希):
- 拼接可用
new Uint8Array(totalLength)+.set(chunk, offset) - 若全量校验失败,说明存在未被发现的分片错误或服务端数据异常,应整体失败并提示用户刷新重试
- 成功后可转为 Blob 供下载或进一步处理
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










