node.js - 使用 NodeJS Multer 转换上传

标签 node.js express multer busboy

我目前正在为我的用户实现文件/图片上传服务。我想在上传到我的 s3 存储桶之前转换这些图像(调整大小/优化)。

我目前在做什么:在我的前端使用多部分表单(我认为实际的实现在这里并不重要..)以及 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 和 express)。

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

最佳答案

不确定您是否仍在寻找这个问题的答案,但我遇到了同样的问题。我决定扩展 multer-s3 包。

我已经向 original repository 打开了一个拉取请求, 但现在,您可以使用 my fork .

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

  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 的名称获得。

关于node.js - 使用 NodeJS Multer 转换上传,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35541138/

相关文章:

node.js - express ,多条路线到同一功能

node.js - 在同一 POST 请求上使用 multer (NodeJS) + 其他表单数据上传文件 (Angular)

node.js - 我想在本地上传一个文件,然后将该文件上传到 S3。然而 Multer 一次只允许其中之一

node.js - Aws Ubuntu 上的 NodeJs 应用程序在 ipv6 上运行

node.js - 使用 Controller 内的 Express 和 Multer 解析请求

node.js - 如何使用 Node js 配置防火墙?

javascript - 在学习 NodeJs 时,我遇到了 "cannot get ' 地址“”问题

node.js - 将更新推送到运行 Node 应用程序的设备

node.js - 子文件与 Mongoose 人口

node.js - Express JS api 端点在 azure web 应用程序上不起作用