【问题标题】:NodeJS - Validate extension before uploading multiple files with multer?NodeJS - 在使用 multer 上传多个文件之前验证扩展名?
【发布时间】:2019-02-04 07:24:39
【问题描述】:

我遇到过 multer 并上传到 S3: 我通过以下方式发送 5 张图片:

app.post(
    '/upload',
    upload.fields(
    [
        { name: 'image', maxCount: 1 },
        { name: 'image2', maxCount: 1 },
        { name: 'image3', maxCount: 1 },
        { name: 'image4', maxCount: 1 },
        { name: 'image5', maxCount: 1 }
    ]),
    (req, res, next) => {
    res.status(200).send('Files uploaded successfully.')
});

使用以下 multer 实现:

var upload = multer({
  storage: multerS3({
    s3: s3,
    bucket: myBucket,
    fileFilter: (res, file, callback) => {
        var ext = path.extname(file.originalname);
        if(ext !== '.png' && ext !== '.jpg' && ext !== '.jpeg') {
            res.status(400).send('Only images are allowed')
        }
        callback(null, true)
    },
    acl: 'public-read',
    contentType: multerS3.AUTO_CONTENT_TYPE,
    key: function (req, file, cb) {
        uuidFileName = uuidv4();
        fileNamesArray.push(uuidFileName);
        if (!file.originalname.match(/\.(jpg|jpeg|png|gif)$/)) {
            return cb(new Error('Only image files are allowed!'));
        }
        cb(null, uuidFolderName + '/' + uuidFileName + '.' + mime.getExtension(file.mimetype))
    }
  })
})

我的问题是,例如,当客户端以 PDF 格式发送第五张图片时,已经将 4 张图片上传到 S3。虽然删除它们并取消整个过程效率不高,但我一直在研究 multer 的多次上传选项但没有成功,并且没有保证在上传第一个之前它实际上会阻止。

有什么想法吗?

【问题讨论】:

  • 这会有点离题,但你确定你的fileFilter 函数工作正常吗?从 Multer 的文档中可以看出,第一个参数是 req,而不是 res。请看here。无论如何,你应该使用return res.status(...)。如果没有return 声明,您的callback 将始终被解雇。

标签: node.js express multer multer-s3


【解决方案1】:

首先,在前端部分,您可以使用输入标签的accept 属性指定上传按钮接受的MIME 类型。

在背面,您可以使用 express-fileupload,获取 mime 类型或仅获取文件名,并在它们不匹配时返回错误。

例子:

const fileUpload = require('express-fileupload');
const customCheckFiles = (req, res, next) => {
   const fileNames = Object.keys(req.files).map(key => req.files[key].name);
   return fileNames.every(filename => !!filename.match(/\.(jpg|jpeg|png|gif)$/))
     ? next() // let multer do the job
     : res.status(400).json({error: "Wrong image formats"});
}

app.post(
    '/upload',
    fileUpload(),
    customCheckFiles
    upload.fields(
    [
        { name: 'image', maxCount: 1 },
        { name: 'image2', maxCount: 1 },
        { name: 'image3', maxCount: 1 },
        { name: 'image4', maxCount: 1 },
        { name: 'image5', maxCount: 1 }
    ]),
    (req, res, next) => {
    res.status(200).send('Files uploaded successfully.')
});

我没有测试代码,它只是作为一个例子。

希望对你有帮助,
最好的问候

【讨论】:

    猜你喜欢
    • 2018-06-18
    • 2015-06-29
    • 2011-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-09
    • 2020-06-10
    • 2014-11-06
    相关资源
    最近更新 更多