NodeJS:动态地从另一个流创建调整大小的文件流

时间:2017-09-01 10:23:06

标签: node.js amazon-web-services amazon-s3 stream swagger

我需要使用带有swagger的NodeJS编写上传代码。要求是创建两个已调整大小的文件并将其发送到AWS S3。我可以通过以下方式做到这一点:

  • 将传入的文件保存在磁盘上。
  • 打开原始文件,调整大小(版本1)并将其保存在磁盘上。
  • 再次打开原始文件,调整其大小(版本2)并保存 磁盘。
  • 从版本1
  • 创建stream1
  • 从版本2
  • 创建stream2
  • 将两个流发送到S3
  • 删除残留文件

我正在寻找的是动态地从传入流创建调整大小的文件并将它们发送到S3而不保存磁盘上的任何内容。这可能吗?是否有任何模块可以从另一个流创建调整大小的图像流?

我可以从上传的文件中获取流:

var _originalStream = new Buffer(req.swagger.params.uploadedFile.value.buffer, 'binary');

接下来我需要使用上面的流并从中创建两个流。

1 个答案:

答案 0 :(得分:0)

您可以使用sharp

const sharp = require('sharp');
const fs    = require('fs');

let pipeline = sharp();

// temporary files (see text)
let version1 = fs.createWriteStream('output1.jpg');
let version2 = fs.createWriteStream('output2.jpg');

pipeline.clone().resize(800, 600).pipe(version1);
pipeline.clone().resize(320, 240).pipe(version2);

_originalStream.pipe(pipeline).on('finish', () => {
  console.log('done');
  ...upload files to S3 and remove temporary files...
});

如您所见,它可以使用.clone()直接创建两个(或更多)已调整大小的输出。

此外,您可以使用S3流直接上传文件而不是使用临时文件(我不熟悉S3以提供示例代码,但这不应该太难)。

暂且不说:示例中的_originalStream不是流,而是Buffer。您也可以将这些用作sharp的输入。这可能会奏效:

let pipeline = sharp(req.swagger.params.uploadedFile.value.buffer);

(在这种情况下,您不使用_originalStream.pipe()