Express - 如何使用express-validator验证文件输入?

时间:2016-09-26 13:01:52

标签: validation express

我正在使用express-validator进行验证。在我的控制器中,我有一种方法可以将新图片添加到数据库中。这是我的代码:

function createPicture(req, res) {

req.checkBody('title', `The title can't be empty.`).notEmpty();
req.checkBody('image', 'You must select an image.').notEmpty();

let errors = req.validationErrors();

if (errors) {
    res.json({errors: errors});
} else { ... }

代码适用于标题字段,但无论我是否选择图像 - 我仍然会收到有关它的验证错误。如何验证文件输入?我只是想要它。

2 个答案:

答案 0 :(得分:4)

我遇到了同样的问题,下面的代码无效,因为express-validator只验证字符串

req.checkBody('title', 'The title can't be empty.').notEmpty();

req.checkBody('image', 'You must select an image.').notEmpty();

你需要编写一个自定义验证器,express-validator允许这样做,好吧这是一个例子

//requiring the validator
var expressValidator = require('express-validator');
//the app use part
app.use(expressValidator({
customValidators: {
    isImage: function(value, filename) {

        var extension = (path.extname(filename)).toLowerCase();
        switch (extension) {
            case '.jpg':
                return '.jpg';
            case '.jpeg':
                return '.jpeg';
            case  '.png':
                return '.png';
            default:
                return false;
        }
    }
}}));

要使用自定义验证器,请首先执行此操作以确保空文件不会抛出未定义的错误:

restLogo = typeof req.files['rest_logo'] !== "undefined" ? req.files['rest_logo'][0].filename : '';

最后使用您的自定义验证器:

req.checkBody('rest_logo', 'Restaurant Logo - Please upload an image Jpeg, Png or Gif').isImage(restLogo);

感谢您提出的问题,希望这会对某人有所帮助

答案 1 :(得分:0)

为了验证文件输入字段,您可以使用 multer :将中间对象和文件对象添加到请求对象的中间件。
然后使用链接到您的验证中间件的 express-validator .custom() 验证功能。

使用multer可以通过req.file访问文件输入字段,并通过req.body访问其他输入字段(如果有)。

req.file将返回一个包含以下6个字段的对象:(以pdf为例)

{
  fieldname: 'fileInputFieldName',
  originalname: 'uploaded_file.pdf',
  encoding: '7bit',
  mimetype: 'application/pdf',
  buffer: <Buffer 2 ... 192685 more bytes>,
  size: 192735
}

假设您只想接受pdf文件: 您可以针对上传文件的模仿类型进行验证(可以通过req.file.mimetype访问):

// express-validator import
const { check, validationResult } = require('express-validator'); 

// multer import and setup
const multer = require('multer');
const storage = multer.memoryStorage(); // Holds a buffer of the file in memory
const upload = multer({ storage: storage });


exports.post_file = [
// multer middleware
upload.single('fileInputFieldName'),


// express-validator middleware
check('fileInputFieldName')
.custom((value, {req}) => {
        if(req.files.mimetype === 'application/pdf'){
            return '.pdf'; // return "non-falsy" value to indicate valid data"
        }else{
            return false; // return "falsy" value to indicate invalid data
        }
    })
.withMessage('Please only submit pdf documents.'), // custom error message that will be send back if the file in not a pdf. 


// process the request with validated user inputs
(res, req, next) => {
    ...
    ...
}
]