2016-01-27 1 views
3

Im играя с загрузкой файлов в Node.js/multerCant получить multer обработки ошибок FileFilter работать

Я получил хранение и пределы рабочих. Но теперь им играть с FileFilter просто отрицать некоторые файлы MimeType так:

fileFilter: function (req, file, cb) { 
if (file.mimetype !== 'image/png') { 
    return cb(null, false, new Error('goes wrong on the mimetype')); 
} 
cb(null, true); 
} 

Когда файл будет загружен, что не детские это не примет его. Но это также не вызовет if(err)

Когда файл является большим, он генерирует ошибку. Так почему-то мне нужно создать ошибку на filefilter, но я не уверен, как и догадываться new Error не так

Так как же я должен генерировать ошибку, если файл неправильный. Что я делаю не так?

Полный код:

var maxSize = 1 * 1000 * 1000; 

var storage = multer.diskStorage({ 
    destination: function (req, file, callback) { 
    callback(null, 'public/upload'); 
    }, 
    filename: function (req, file, callback) { 
    callback(null, file.originalname); 
    } 
}); 


var upload = multer({ 
    storage : storage, 
    limits: { fileSize: maxSize }, 
    fileFilter: function (req, file, cb) { 
    if (file.mimetype !== 'image/png') { 
     return cb(null, false, new Error('I don\'t have a clue!')); 
    } 
    cb(null, true); 
    } 

}).single('bestand'); 


router.post('/upload',function(req,res){ 
    upload(req,res,function(err) { 
     if(err) { 
       return res.end("some error"); 
     } 
    )} 
)} 

ответ

5

функция FileFilter имеет доступ к запросу объекта (REQ). Этот объект также доступен в вашем маршрутизаторе.

Поэтому в файлеFitler вы можете добавить свойство с ошибкой проверки или списком ошибок проверки (вы можете загрузить много файлов, а некоторые из них могут пройти). И в маршрутизаторе вы проверяете, существует ли свойство с ошибками.

фильтр:

fileFilter: function (req, file, cb) { 
if (file.mimetype !== 'image/png') { 
    req.fileValidationError = 'goes wrong on the mimetype'; 
    return cb(null, false, new Error('goes wrong on the mimetype')); 
} 
cb(null, true); 
} 

в маршрутизаторе:

router.post('/upload',function(req,res){ 
    upload(req,res,function(err) { 
     if(req.fileValidationError) { 
       return res.end(req.fileValidationError); 
     } 
    )} 
)} 
+0

Ааа это звучит хорошо. Я собираюсь проверить это позже сегодня, когда я вернусь домой. Благодаря! –

+1

Если вы измените ext exe-файла на png, вы можете сделать multer fool. –

+0

уверен. Это всегда о том, чего вы хотите. Иногда достаточно проверить ext, и нам все равно, что с ним происходит. Иногда вы хотите проверить первые байты файла, чтобы убедиться, какой у него настоящий тип - например, когда вам нужно что-то делать с этим файлом. Но что, если файл поврежден. В этом случае вам также необходимо проверить полный файл. В качестве инженеров наша ответственность заключается в выборе лучших инструментов для каждого сценария –