おそらく大きな(100 Mb以上)ファイルへのURLがありますが、フェッチを使用してローカルディレクトリに保存するにはどうすればよいですか?
私は周りを見回しましたが、これを行う方法についてのリソース/チュートリアルはあまりないようです。
ありがとうございました!
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();
});
});
});
他の非常に細かい答えのように明示的に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つの答えは、受信したデータストリームをすべてバッファに蓄積せずにファイルに直接パイプするため、メモリ効率が高くなります。