私は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");
}
)}
)}
_
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);
}
)}
)}
エラーを最初のパラメーターとして渡すことができます。
multer({
fileFilter: function (req, file, cb) {
if (path.extension(file.originalname) !== '.pdf') {
return cb(new Error('Only pdfs are allowed'))
}
cb(null, true)
}
})
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);
};