0

そのため、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);
4

1 に答える 1

0

そのため、ストリームを何度もログに記録した後。パイプは 2 つのストリームの機能を結合するのではなく、2 つのストリーム間のフローを作成するだけだと思います。したがって、パススルーとアーカイバをパイプしてから、アーカイバを返してファイルを追加する必要があります。

function uploadFromStream(bucket, destination) {
  const pass = new stream.PassThrough();

  const params = { Bucket: bucket, Key: destination, Body: archive };

  S3.upload(params, function (err, data) {
    console.log(err, data);
  });
  archive.pipe(pass);

  return archive;
}

これを行うことで、上記のエラーに直面していません。私の悪い点は、初めてストリームを操作することでした

于 2020-06-21T06:15:04.300 に答える