gpt4 book ai didi

使用 HTTP Range header 的 Node.js 脚本请求导致字节数多于请求的字节数。

转载 作者:行者123 更新时间:2023-12-02 12:18:06 27 4
gpt4 key购买 nike

我正在尝试编写一个接受 URL 的 Node.js 脚本(用于下载一个文件)通过命令行指定。使用 HTTP Range 请求 header ,脚本以可配置的 block 数和 block 大小下载文件,然后以正确的字节顺序写入输出文件。

目前正在寻求使用 2 个 1 MiB(1,048,576 字节)的 block 来实现这一目标,总共 2 MiB(2,097,152 B)。

当前我在执行中遇到的问题或者只是我的理解是,我的脚本为每个请求写入约 1,800,000 字节,导致总共 3,764,942 字节。不确定这些额外的字节来自哪里?

这是由于我在该脚本中遗漏了一个错误,还是由于所使用的请求库的开销,或者我是否遗漏了有关 Mib 到字节转换的某些内容?

  • 只要字节数正确且顺序正确,文件内容目前基本上无关紧要。
  • 使用设置为 1MiB block 的范围 header 来 curl 测试 URL,然后附加到文件会导致更接近预期的总字节数。 curl 'https://eloquentjavascript.net/Eloquent_JavaScript.pdf' -i -H "范围:字节=0-2097152" => 2097435 B 文件
  • 我正在终端 node index.js --url='https://eloquentjavascript.net/Eloquent_JavaScript.pdf' --file='newfile.txt' --chunks 2 中运行此命令
  • 使用 Node v10.12.0、minimist v1.2.0 和 request-promise v4.2.2

下面的整个脚本:

'use strict';

const argv = require('minimist')(process.argv.slice(2), {
default: {
file: 'output.txt',
MiB: 1,
chunks: 4
}
});
const fs = require('fs');
const request = require('request-promise');

// Source URL must be specified through command line option.
if (!argv.url) throw Error('Source URL is required!');

const options = {
method: 'GET',
uri: argv.url
}

const determineChunkRange = (step) => {
// 1 Mib = 1,048,576 B.
// Only 1 MiB chunks are downloaded.
const chunkSize = argv.MiB * 1048576;
const startOfRange = step === 0 ? 0 + ((chunkSize * step)) : 1 + ((chunkSize * step));
const endOfRange = startOfRange + chunkSize;

return {'Range': `bytes=${startOfRange}-${endOfRange}`}
}

const getOptions = (step) => {
options.headers = determineChunkRange(step);

return options;
}

const addDataToFile = (data) => {
try {
fs.appendFileSync(argv.file, data);
console.log("Data written to file.");
} catch (err) {
console.log(`Error appending to ${argv.file}`, err);
}
}

// Create or Replace file with specific filename.
fs.writeFileSync(argv.file, '');
console.log("Successfully created new file.");

// Make specified number of requests.
for (let i = 0; i < argv.chunks; i++) {
const options = getOptions(i);

// make request to specified URL.
request(options)
.then(response => {
console.log(i, options)
addDataToFile(response)
})
.catch(error => {
console.log(`Error making request to ${argv.url}`, error)
});
}

最佳答案

问题是您添加了整个响应对象,而不是它的内容/正文。

您可以使用响应的 data 事件来获取内容,然后将其附加到文件中。

关于使用 HTTP Range header 的 Node.js 脚本请求导致字节数多于请求的字节数。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53712462/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com