Multer fileFilter не вызывается и req.body пуст - PullRequest
0 голосов
/ 22 ноября 2018

по какой-то причине fileFilter на multer не вызывается.

здесь мой контроллер (я использую экспресс-маршрутизаторы)

const express = require('express');
const router = express.Router();
const UploadController = require('../controllers/UploadController');

router.route('/upload').post(UploadController.upload);

module.exports = router;

, а это контроллер

const multer = require('multer');
const fs = require('fs');

module.exports = {
    upload: function (req, res) {
        let storage = multer.diskStorage({
            destination: function (req, file, cb) {
                console.log('here');
                const filesDir = './uploads/' + req.body.ref;
                if (!fs.existsSync(filesDir)) {
                    fs.mkdirSync(filesDir);
                }
                cb(null, filesDir);
            },
            filename: function (req, file, cb) {
                let extArray = file.mimetype.split("/");
                let extension = extArray[extArray.length - 1];
                cb(null, req.body.type + '-' + Date.now() + '.' + extension);
            },
            fileFilter : function (req, file, cb) {
                if (!file.originalname.match(/\.(jpg|jpeg|png|gif)$/)) {
                    return cb(new Error('Only image files are allowed!'), false);
                }
                cb(null, true);
            }
        })
        const upload = multer({ storage: storage }).single('file');

        upload(req, res, function (err) {
            if (err instanceof multer.MulterError) {
                res.send({
                    error: err
                });
            } else if (err) {
                res.send({
                    error: err
                });
            }else{
                res.send({
                    file: req.file,
                    body: req.body
                });
            }

        });
    }
}

У меня следующие проблемы:

  • Функция fileFilter даже не вызывается, поэтому она не проверяет файлы
  • req.body для функции загрузки (upload: function (req, res)) пусто, оно доступно только в diskStorage и функции последней загрузки (upload (req, res, function (err))), поэтому я не могу также проверить данные тела.

1 Ответ

0 голосов
/ 14 марта 2019

У меня была такая же проблема.Функция fileFilter должна быть определена внутри multer, а не внутри функции diskStorage.

Чтобы сделать ее более читабельной, я определил хранилище и фильтрую переменные вместо того, чтобы делать все внутри multerзвоните.

// storage settings
const multerStorage = multer.diskStorage({
    destination: function(req, file, next) {
        next(null, './public/files');
    },
    filename: function(req, file, next) {
        const sanitizedName = file.originalname
            .replace('/[^a-z0-9\./gi', '-')
            .replace('/-{2,}/g', '-')
            .toLowerCase();
         const name = Date.now() + '-' + sanitizedName;

         // sending the file name to be stored in the database
         req.body.filename = name;

         next(null, name);
     },
     limits: {
         fileSize: 25000000
     }
 });

 // filter function
 const multerFilter = function(req, file, cb) {
     const ext = path.extname(file.originalname).toLowerCase();

     if (ext !== '.pdf') {
         cb(new Error('File must be in PDF format.'));
     }

     cb(null, true);
 }

А затем примените настройки хранения и функцию фильтра к multer:

const upload = multer({
    storage: multerStorage,
    fileFilter: multerFilter
});
...