JavaScript分片下载中HTTP Range Header计算的异常问题
HTTP Range Header分片下载结果不一致的修复方案
你的分片范围生成逻辑存在问题:最后一个分片的结束位置会超出原文件的实际字节索引范围,导致计算出的总大小和原文件不符,进而引发Range Header请求结果不一致。
举个例子,调用generateRange(200,7)时,原文件大小是200字节(索引0-199),但你的代码算出最后一个分片范围是174-202,这明显超出了文件实际范围,服务器返回的内容自然会和预期不符。
修正后的代码
function generateRange(originalSize, split) { let resultSize = 0; let arr = []; const chunkSize = Math.ceil(originalSize / split); for (let i = 0; i < split; i++) { const min = i * chunkSize; // 最后一个分片的结束位置不能超过文件的最大索引(originalSize - 1) const max = Math.min(min + chunkSize - 1, originalSize - 1); const currentChunkSize = max - min + 1; resultSize += currentChunkSize; arr.push(`${min}-${max}`); } console.log(JSON.stringify(arr)); console.log(`split: ${split} | originalSize: ${originalSize} bytes | resultSize: ${resultSize} bytes\n\n`); } generateRange(200, 4); // 正常工作 generateRange(200, 7); generateRange(469, 4);
关键修改点
- 限制每个分片的
max值为Math.min(min + chunkSize - 1, originalSize - 1),确保不会超出文件的实际字节索引范围 - 计算
resultSize时,使用当前分片的实际大小(max - min + 1),而不是固定的chunkSize - 修复了循环变量
i未声明的问题(原代码中i是全局变量,改为let i避免污染全局作用域)
运行修正后的代码,三个测试用例的resultSize都会和originalSize完全一致,生成的Range范围也符合HTTP标准要求。
内容的提问来源于stack exchange,提问作者uingtea
相关产品推荐
相关产品推荐

