我有一个可能很大(100+ Mb)文件的网址,如何使用fetch将其保存在本地目录中?
我环顾四周,但似乎没有很多关于如何做到这一点的资源/教程。
谢谢!
答案 0 :(得分:5)
使用提取API,您可以编写一个可以从此类网址下载的函数。
const downloadFile = (async (url, path) => {
const res = await fetch(url);
const fileStream = fs.createWriteStream(path);
await new Promise((resolve, reject) => {
res.body.pipe(fileStream);
res.body.on("error", (err) => {
reject(err);
});
fileStream.on("finish", function() {
resolve();
});
});
});
希望这会有所帮助
答案 1 :(得分:0)
如果您想避免像在另一个非常好的答案中那样明确做出Promise,并且可以为整个100+ MB文件建立一个缓冲区,那么您可以做一些简单的事情:
const fetch = require('node-fetch');
const {writeFile} = require('fs');
const {promisify} = require('util');
const writeFilePromise = promisify(writeFile);
function downloadFile(url, outputPath) {
return fetch(url)
.then(x => x.arrayBuffer())
.then(x => writeFilePromise(outputPath, Buffer.from(x)));
}
但是另一个答案将是更高的内存效率,因为它将接收到的数据流直接管道传输到文件中,而不是将所有数据流都累积在缓冲区中。
答案 2 :(得分:0)
const {createWriteStream} = require('fs');
const {pipeline} = require('stream');
const {promisify} = require('util');
const fetch = require('node-fetch');
const downloadFile = async (url, path) => promisify(pipeline)(
(await fetch(url)).body,
createWriteStream(path)
);