如何使用Fetch API下载和保存文件? (Node.js的)

时间:2016-06-03 12:40:13

标签: javascript node.js xmlhttprequest fetch fetch-api

我有一个可能很大(100+ Mb)文件的网址,如何使用fetch将其保存在本地目录中?

我环顾四周,但似乎没有很多关于如何做到这一点的资源/教程。

谢谢!

3 个答案:

答案 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)
);