web-dev-qa-db-ja.com

マルターファイルフィルターのエラー処理を機能させることができない

私はnode.js/multerでファイルのアップロードをいじっています

ストレージと制限が機能するようになりました。しかし、今は次のようにmimetypeでいくつかのファイルを単に拒否するためにfilefilterで遊んでいます:

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

Png以外のファイルがアップロードされると、受け入れられません。しかし、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");
        }
    )}
)}
_
12
Merijn de Klerk

fileFilter関数は、要求オブジェクト(req)にアクセスできます。このオブジェクトはルーターでも使用できます。

したがって、fileFitlerでは、検証エラーまたは検証エラーリストを含むプロパティを追加できます(多くのファイルをアップロードでき、一部は通過する可能性があります)。そしてルーターで、エラーのあるプロパティが存在するかどうかを確認します。

フィルター:

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);
        }
    )}
)}
13

エラーを最初のパラメーターとして渡すことができます。

multer({
  fileFilter: function (req, file, cb) {
    if (path.extension(file.originalname) !== '.pdf') {
      return cb(new Error('Only pdfs are allowed'))
    }

    cb(null, true)
  }
})
1
Gabriel Hidalgo

fileFilterを変更し、cb関数にエラーを渡します。

function fileFilter(req, file, cb){
   const extension = file.mimetype.split('/')[0];
   if(extension !== 'image/png'){
       return cb(new Error('Something went wrong'), false);
    }
    cb(null, true);
};
1