Amazon S3バケットにアップロードするファイルのURLの配列があります。配列に2916のURLがあり、ファイルの合計サイズは361MBです。Node.jsのamazon S3へのリモートファイルのストリーム配列
ストリームを使用してこれを達成しようとすると、あまりにも多くのメモリを使用しないようにします。私のソリューションは、すべての2916ファイルがアップロードされるという意味で機能しますが、アップロードされたファイルの合計サイズは実行ごとに200MBから361MBまで異なるため、(少なくとも一部の)アップロードは不完全であるようです。
// Relevant code below (part of a larger function)
/* Used dependencies and setup:
const request = require('request');
const AWS = require('aws-sdk');
const stream = require('stream');
AWS.config.loadFromPath('config.json');
const s3 = new AWS.S3();
*/
function uploadStream(path, resolve) {
const pass = new stream.PassThrough();
const params = { Bucket: 'xxx', Key: path, Body: pass };
s3.upload(params, (err, data) => resolve());
return pass;
}
function saveAssets(basePath, assets) {
const promises = [];
assets.map(a => {
const url = a.$.url;
const key = a.$.path.substr(1);
const localPromise = new Promise(
(res, rej) => request.get(url).pipe(uploadStream(key, res))
);
promises.push(localPromise);
});
return Promise.all(promises);
}
saveAssets(basePath, assets).then(() => console.log("Done!"));
〜25秒後に(それは「やった!」を書き込むことは約束と少し厄介だが、私はすべてのファイルがアップロードされた際に伝えることができる必要があり、この部分は、少なくともうまく動作するようですすべての約束が解決されたとき)。
私はストリームに新しいので、私がこれを間違った方法で近づけば自由に感じてください;-)本当に私はいくつかのポインタを得ることができますように!