Multer fileFilter不生效:上传非法格式文件未返回错误状态
问题原因与解决方案
问题根源
当你在fileFilter中调用cb(null, false)时,Multer的行为是跳过当前不符合条件的文件,而非触发错误或终止上传流程。如果上传的所有文件都被过滤掉,req.files会变成空数组[]——而在JavaScript中,空数组属于“真值”(Boolean([]) === true),所以路由里的if (req.files)判断会成立,进而返回成功响应,不会进入错误分支。
解决方案
你可以根据需求选择以下两种方案:
方案一:判断有效上传文件数量
修改路由的判断逻辑,检查req.files的长度是否大于0,而非仅判断其是否存在:
const router = express.Router(); const uploadImg = require("../middlewares/UploadImageEspecie"); router.post("/uploadImg", uploadImg.array('images', 12), async (req, res) => { if (req.files.length > 0) { console.log(req.files) return res.json({ error: false, message: "Upload realizado com sucesso!" }) } else { return res.status(400).json({ error: true, message: 'Erro: Upload não realizado com sucesso, necessário enviar imagens no formato PNG, JPG ou JPEG.' }) } }); module.exports = router;
该方案适合允许部分文件通过的场景(比如上传多个文件时,保留符合格式的,忽略不符合的)。
方案二:文件过滤时主动抛出错误
修改Multer配置的fileFilter,当文件格式不符合时抛出错误,让Multer终止上传并触发错误处理流程:
module.exports = (multer({ storage: multer.diskStorage({ destination: (req, file, cb) => { cb(null, './public/upload/especies') }, filename: (req, file, cb) => { cb(null, Date.now().toString() + "_" + file.originalname) } }), fileFilter: function (req, file, cb) { if (!file.originalname.match(/\.(jpg|jpeg|png)$/)) { console.log('false') // 抛出自定义错误 return cb(new Error('InvalidFileFormat'), false); } console.log('true') return cb(null, true); } }))
然后在路由中添加错误处理中间件捕获该错误:
const router = express.Router(); const uploadImg = require("../middlewares/UploadImageEspecie"); router.post("/uploadImg", uploadImg.array('images', 12), async (req, res) => { console.log(req.files) return res.json({ error: false, message: "Upload realizado com sucesso!" }) }, (err, req, res, next) => { // 捕获自定义的文件格式错误 if (err.message === 'InvalidFileFormat') { return res.status(400).json({ error: true, message: 'Erro: Upload não realizado com sucesso, necessário enviar imagens no formato PNG, JPG ou JPEG.' }) } // 其他错误交给下一个中间件处理 next(err); }); module.exports = router;
该方案适合只要有一个文件不符合格式就直接拒绝整个上传请求的场景。
内容的提问来源于stack exchange,提问作者Mariana Monteiro
相关产品推荐
相关产品推荐

