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
 }

在 axios 端

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;
}

现在,当我尝试追加时,当 finalize 不是函数时,我收到错误 append not a function same 。当我检查时,我发现 s3Stream.append 和 s3Stream.finalize 是未定义的。我不认为它应该发生,但我猜 PassThrough 正在从组合流中删除函数。

像这样的管道流也不起作用。

  return archive.pipe(pass);
4

1 回答 1

0

所以在多次记录流之后。我认为管道不结合两个流的功能,而只是在两个流之间创建一个流。所以我只需要管道 passThrough 和归档器,然后返回归档器以将文件附加到它。

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 回答