javascript中模拟分片下载md5校验不一致,需拦截分片请求篡改某一片数据、劫持md5计算函数返回错误值,或构造污染的本地分片文件,确保合并后md5与预期不符,用于测试断点续传健壮性。

在 JavaScript 中模拟分片下载后校验 MD5 不一致的场景,核心是**绕过真实网络请求、控制分片内容、使最终拼接的文件数据与预期 MD5 不匹配**。这常用于测试断点续传逻辑、校验失败重试、错误提示等健壮性行为。
1. 拦截并伪造分片请求(如使用 Mock Service Worker 或 sinon)
用 MSW(Mock Service Worker) 拦截每个分片的 GET 请求,返回篡改过的二进制数据:
- 对前几片返回正常 ArrayBuffer
- 对某一片(如第 3 片)返回故意修改后的 buffer(比如末尾多写一个字节、或翻转某字节)
- 确保所有分片 size 总和不变,但内容已变 → 最终合并的 Blob/ArrayBuffer 的 MD5 必然不同
示例(MSW):
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
rest.get('/download/chunk/:index', (req, res, ctx) => {
const index = Number(req.params.index);
if (index === 2) { // 故意污染第 3 片(0 起始)
const fakeData = new Uint8Array([/* 正常数据 + 1 个干扰字节 */]);
return res(ctx.status(206), ctx.set('Content-Range', 'bytes 200000-299999/500000'), ctx.body(fakeData));
}
// 其他片返回真实模拟数据
});
2. 替换客户端 MD5 计算逻辑(直接注入错误结果)
若无法或不便 mock 网络层,可在测试中**劫持 MD5 计算函数**,让其对完整文件返回错误值:
- 使用
jest.mock()或直接重定义spark-md5.ArrayBuffer等方法 - 让校验时调用的
hash()返回预设的错误字符串(如把正确值'a1b2c3...'改成'x9y8z7...') - 适用于单元测试,无需启动服务,速度快
3. 构造不一致的本地分片文件(端到端测试用)
在 e2e 测试中,可预先生成两套分片:
- 一套为「原始分片」(用于服务端提供)
- 另一套为「污染分片」(仅客户端本地缓存或模拟存储中写入)
- 下载时读取本地污染分片 → 合并后计算 MD5 → 必然不一致
适合测试离线续传、本地缓存篡改等边界场景。
4. 关键注意点
- 确保分片
Content-Range头与实际 body 长度一致,否则浏览器可能拒绝解析 - MD5 校验应在所有分片合并为完整 ArrayBuffer 后再计算,不要对每片单独校验(除非业务要求)
- 若用
Blob.slice()拼接,注意跨浏览器兼容性;推荐用new Blob(chunks).arrayBuffer()或Uint8Array手动合并 - 错误处理逻辑需覆盖:弹窗提示、自动重试、清除缓存、回退到全量下载等
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










