NodeJS-在使用multer上传多个文件之前验证扩展名?

时间:2018-08-29 13:24:18

标签: node.js express multer multer-s3

我遇到了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的多重上传选项,但没有成功,而且也没有保证会在上传第一个之前真正阻止。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

首先,在前端部分,您可以使用输入标签的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.')
});

我没有测试代码,仅作为示例。

希望有帮助,
最好的问候