用NodeJS Multer转换上传

我目前正在为我的用户实施文件/图片上传服务。 我想在上传到我的S3存储桶之前转换这些图像(resize/优化)。

我现在正在做的是:在我的前端使用多部分表单(我认为这里的实际实现并不重要),以及后端的multermulter-s3包。

在这里,我的实施被剥夺了重要的部分。

 // SETUP var multer = require('multer'); var s3 = require('multer-s3'); var storage = s3({ dirname: 'user/uploads', bucket: auth.aws.s3.bucket, secretAccessKey: auth.aws.s3.secretAccessKey, accessKeyId: auth.aws.s3.accessKeyId, region: auth.aws.s3.region, filename: function (req, file, cb) { cb(null, Date.now()); } }); var upload = multer({storage: storage}).single('img'); // ROUTE module.exports = Router() .post('/', function (req, res, next) { upload(req, res, function (err) { if (err) { return res.status(401).json({err: '...'}); } return res.json({err:null,url: '..'}); }); }); 

我想要做的是:在上传之前转换图像。 我不确定是否需要在这里使用multer / busboy,或者我可以使用NodeJS来完成(因此我也标记了NodeJS并expression了它)。

所以我的问题是:我在哪里可以拦截上传并将其上传到我的S3存储桶之前进行转换?

不知道你是否还在寻找这个答案,但我有同样的问题。 我决定延长multer-s3软件包。

我已经打开了一个拉请求到原始的存储库 ,但现在,你可以使用我的叉子 。

以下是如何使用扩展版本的示例:

  var upload = multer({ storage: multerS3({ s3: s3, bucket: 'some-bucket', shouldTransform: function (req, file, cb) { cb(null, /^image/i.test(file.mimetype)) }, transforms: [{ id: 'original', key: function (req, file, cb) { cb(null, 'image-original.jpg') }, transform: function (req, file, cb) { cb(null, sharp().jpg()) } }, { id: 'thumbnail', key: function (req, file, cb) { cb(null, 'image-thumbnail.jpg') }, transform: function (req, file, cb) { cb(null, sharp().resize(100, 100).jpg()) } }] }) }) 

编辑:我的叉现在也可以通过npm名下的multer-s3-transform

我已经尝试使用@ ItsGreg的叉子,但不能得到它的工作。 我设法通过使用multer-s3标准configuration,并在我的file upload端点,即,

app.post('/files/upload', upload.single('file'), (req, res) => {...})

我正在使用请求检索文件,并将缓冲区传递给sharp 。 下面的作品(并假设你正在使用~/.aws/credentials ):

  let request = require('request').defaults({ encoding: null }); let dataURI = `https://s3.amazonaws.com/${process.env.AWS_S3_BUCKET}/${image.defaultUrl}`; request.get(dataURI, function (error, response, body) { if (! error && response.statusCode === 200) { let buffer = new Buffer(body); const sizes = ['thumbnail', 'medium', 'large']; sizes.forEach(size => { sharp(buffer) .resize(image.sizes[size]) .toBuffer() .then(data => { // Upload the resized image Buffer to AWS S3. let params = { Body: data, Bucket: process.env.AWS_S3_BUCKET, Key: `${image.filePath}${image.names[size]}`, ServerSideEncryption: "AES256", }; s3.putObject(params, (err, data) => { if (err) console.log(err, err.stack); // an error occurred else console.log(data); // successful response }); }) }) } });