如何使用imagemin压缩图像和busboy

时间:2016-10-26 15:11:39

标签: node.js imagemin

我想使用以下库来压缩图像 https://github.com/imagemin/imagemin

问题是当用户使用表单上传时,如何将表单中的文件详细信息插入到图像min插件中?例如,如果文件表单字段是调用example-image,如何将该文件表单字段插入图像min插件,以便它可以压缩图像?

我试过了:

req来自express / nodejs req

  var filebus = new Busboy({ headers: req.headers }),
   promises = [];

    filebus.on('file', function(fieldname, file, filename, encoding, contentType) {

        var fileBuffer = new Buffer(0),
            s3ImgPath;

        if (file) {
            file.on('data', function (d) {
                fileBuffer = Buffer.concat([fileBuffer, d]);
            }).on('end', function () {
                Imagemin.buffer(fileBuffer, {
                    plugins: [
                        imageminMozjpeg(),
                        imageminPngquant({quality: '80'})
                    ]
                }).then(function (data) {
                    console.log(data[0]);
                    if (s3ImgPath) {
                        promises.push(this.pushImageToS3(s3ImgPath, data[0].data, contentType));
                    }
                });
            }.bind(this));
        }
    });

但问题是我宁愿拥有一个可以上传到S3的文件缓冲区。我不想将文件发送到build / images文件夹。我想获取文件的缓冲区,压缩它,并将该缓冲区上传到s3。如何使用image min通过html表单获取文件上传的缓冲区并将其上传到s3?

1 个答案:

答案 0 :(得分:3)

输出参数的文档显示它是可选的(尽管如此,函数声明没有,这可能会令人困惑)。

  

输出

     

输入:string

     

将目标文件夹设置为文件的写入位置。如果不   指定目的地,不会写入任何文件。

因此,您可以选择不将文件写入存储,只需使用内存中的输出:

imagemin([file.path], {
  plugins: [
      imageminMozjpeg(),
      imageminPngquant({quality: '65-80'})
  ]
}).then(files => {
  // upload file to S3
});