You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 07:58:12