そのため、Axios ストリームを使用してファイルをダウンロードし、アーカイバーで圧縮してから、zip を s3 バケットにアップロードしたいと考えています。最初に、zip をローカル ディレクトリに保存したところ、このようにすべて正常に動作しました。マルチパイプ ライブラリを使用してストリームを結合しました。アーカイバーの zip ストリームを fs.createWriteStream と組み合わせる
function uploadFromStream(name) {
const output = fs.createWriteStream(__dirname + `/${name}.zip`);
const zip= combine(archive, output);
return zip
}
アクシオスの最後に
zip.append(response.data.pipe(new PassThrough()), { name: name });
すべてが期待どおりに機能し、Zip はすべてのファイルとともに保存されています。
次に、ストリームでs3にアップロードする方法を調査して探しました。私はこの方法を見つけました。 ストリームを s3.upload() にパイプする
inputStream .pipe(uploadFromStream(s3));
function uploadFromStream(s3) {
var pass = new stream.PassThrough();
var params = {Bucket: BUCKET, Key: KEY, Body: pass};
s3.upload(params, function(err, data) {
console.log(err, data);
});
return pass;
}
このようなアーカイバでこれを実装しました。
function uploadFromStream(bucket, destination) {
var pass = new stream.PassThrough();
var params = { Bucket: bucket, Key: destination, Body: pass };
S3.upload(params, function (err, data) {
console.log(err, data);
});
const s3Stream = combine(archive, pass);
return s3Stream;
}
今、追加しようとすると、ファイナライズが関数ではない場合、同じ関数ではなく追加エラーが発生します。チェックすると、s3Stream.append と s3Stream.finalize が未定義であることがわかりました。私はそれが起こるべきだとは思いませんが、PassThrough が結合されたストリームから関数を削除していると思います。
また、このようなパイプ ストリームも機能しませんでした。
return archive.pipe(pass);