我希望 Multer 只允许上传照片,但它不起作用,并给出 request.file = undefined ,同时给出正确的 file.mimetype = image/jpeg
我还检查了标题,它包含
Content-Type = multipart/form-data; boundary=<calculated when request is sent>
然后我尝试并从 Multer 中删除了
fileFilter: multerFilter
配置,令人惊讶的是一切工作正常,没有任何问题。相关代码如下:
const multerStorage = multer.memoryStorage();
// 2) Creating a multer filter (to test if the uploaded file is really an image):
const multerFilter = (request, file, cb) => {
if (file.mimetype.startsWith("image")) cb(null, true);
cb(new AppError(400, `The only accepted files are images, please select an image ${request.file} file tyep: ${file.mimetype}`), false);
};
const upload = multer({ storage: multerStorage, fileFilter: multerFilter });
exports.updateMyPhoto = upload.single("photo");
请帮我找出我的 fileFilter 配置有什么问题
更新:
我在
multerFilter
内部的两种条件之间切换,程序现在运行得很好。新代码:
const multerFilter = (request, file, cb) => {
if (!file.mimetype.startsWith("image")) cb(new AppError(400, `The only accepted files are images, please select an image ${request.file} file tyep: ${file.mimetype}`), false);
cb(null, true);
};
我仍然不知道这种行为的原因,所以我很感激你的帮助
您应该使用
cb
关键字调用回调函数 return
。否则,在第一个回调函数调用之后,您的代码将继续,最终将调用第二个回调函数,这将导致出现这个令人困惑的问题。要解决此问题,请使用 return
关键字更新您的代码:
const multerFilter = (request, file, cb) => {
if (file.mimetype.startsWith("image")) return cb(null, true);
return cb(new AppError(400, `The only accepted files are images, please select an image ${request.file} file tyep: ${file.mimetype}`), false);
};
您的第一组代码确实可以工作......它只是没有按照您期望的方式工作。您认为您正在编写
if/else
,但看起来您只是调用了回调 (cb
) 两次。这意味着第二个回调将始终执行。
关于是否在代码中包含大括号存在很多争论,并且两者都有争论,但如果您想避免一个错误来源,那么请始终包含大括号。 这个答案解释得最好。
尝试将您的第一个代码更改为:
const multerFilter = (request, file, cb) => {
if (file.mimetype.startsWith("image")){
cb(null, true);
} else{
cb(new AppError(400, `The only accepted files are images, please
select an image ${request.file} file tyep: ${file.mimetype}`), false);
}
};