必要なパッケージをインストールする
npm install superagent --save
npm install async --save
実装
const client = require('superagent');
const async = require('async');
const fs = require('fs');
const path = require('path');
/**
*
* @param string url ダウンロードurl
* @param string save_to 保存先
* @param function done コールバック
*/
function download(url, save_to, done) {
async.waterfall([
// ダウンロード
(done) => client.get(url).responseType('blob').end(done),
// res.bodyがblobなので、ファイル内容として書き込む
(res, done) => fs.writeFile(save_to, res.body, done)
], done);
}
/**
* main関数
*/
function main() {
// ダウンロード対象
const url = 'http://www.gravatar.com/avatar/bf6182db3f2bb0a39d5b19196d8d447b?s=480';
// 保存先
const save = path.join(__dirname, 'avatar.png');
// ダウンロード
download(url, save, (err) => {
if (err) return console.error(err);
console.log('downloaded', url);
});
}
// main実行
main();
実装したdownload
関数は、async.parallel
で非同期でバッチダウンロードができる。例えば:
// ダウンロード画像の配列
const images = [
'https://hoge.com/img1.png',
'https://hoge.com/img2.png',
'https://hoge.com/img3.png',
...
];
async.parallel(
images.map(img => done => {
const save_as = path.join(__dirname, path.basename(img));
download(img, save_as, err => done(null, err || save_as));
}), (err, imgs) => {
// err = null
// imgsはダウンロードした画像の保存パスかエラーの配列
}
);