web-dev-qa-db-ja.com

Fetch APIを使用してファイルをダウンロードして保存するにはどうすればよいですか? (Node.js)

おそらく大きな(100 Mb以上)ファイルへのURLがありますが、フェッチを使用してローカルディレクトリに保存するにはどうすればよいですか?

私は周りを見回しましたが、これを行う方法についてのリソース/チュートリアルはあまりないようです。

ありがとうございました!

12
Gloomy

Fetch APIを使用すると、次のようなURLからダウンロードできる関数を作成できます。

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();
      });
    });
});
13
code_wrangler

他の非常に細かい答えのように明示的に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)));
}

ただし、もう1つの答えは、受信したデータストリームをすべてバッファに蓄積せずにファイルに直接パイプするため、メモリ効率が高くなります。

3
Ahmed Fasih