将流通过管道传输到 s3.upload()

新手上路,请多包涵

我目前正在使用一个名为 s3-upload-stream 的 node.js 插件将非常大的文件流式传输到 Amazon S3。它使用多部分 API,并且在大多数情况下运行良好。

但是,这个模块已经过时了,我已经不得不对其进行修改(作者也已弃用它)。今天又遇到了亚马逊的一个问题,很想采纳作者的建议,开始使用官方的aws-sdk来完成我的上传。

但。

官方 SDK 似乎不支持到 s3.upload() 的管道。 s3.upload 的本质是您必须将可读流作为参数传递给 S3 构造函数。

我有大约 120 多个用户代码模块,它们执行各种文件处理,并且它们不知道其输出的最终目的地。引擎交给他们一个可管道的可写输出流,然后他们通过管道传递给它。我不能给他们一个 AWS.S3 对象并要求他们调用 upload() 而不向所有模块添加代码。我之所以使用 s3-upload-stream 是因为它支持管道。

有没有办法制作 aws-sdk s3.upload() 我可以将流传输到的东西?

原文由 womp 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1k
2 个回答

用 node.js stream.PassThrough() 流包装 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;
}

原文由 Casey Benko 发布,翻译遵循 CC BY-SA 3.0 许可协议

有点晚的答案,它可能希望帮助别人。您可以同时返回可写流和承诺,这样您就可以在上传完成时获得响应数据。

 const AWS = require('aws-sdk');
const stream = require('stream');

const uploadStream = ({ Bucket, Key }) => {
  const s3 = new AWS.S3();
  const pass = new stream.PassThrough();
  return {
    writeStream: pass,
    promise: s3.upload({ Bucket, Key, Body: pass }).promise(),
  };
}

您可以按如下方式使用该功能:

 const { writeStream, promise } = uploadStream({Bucket: 'yourbucket', Key: 'yourfile.mp4'});
const readStream = fs.createReadStream('/path/to/yourfile.mp4');

const pipeline = readStream.pipe(writeStream);

现在你可以检查承诺:

 promise.then(() => {
  console.log('upload completed successfully');
}).catch((err) => {
  console.log('upload failed.', err.message);
});

或者使用异步/等待:

 try {
    await promise;
    console.log('upload completed successfully');
} catch (error) {
    console.log('upload failed.', error.message);
}

或者 stream.pipe() 返回 stream.Writable,目的地(上面的 writeStream 变量),允许管道链,我们也可以使用它的事件:

  pipeline.on('close', () => {
   console.log('upload successful');
 });
 pipeline.on('error', (err) => {
   console.log('upload failed', err.message)
 });

原文由 Ahmet Cetin 发布,翻译遵循 CC BY-SA 4.0 许可协议

推荐问题