HTML表单上传文件返回req.file undefined但Postman可正常上传的问题
问题排查与解决方案
按优先级逐一排查以下问题即可定位原因:
1. Multer中间件变量名不匹配
你当前Multer配置中导出的中间件实例名为upload:
const storage = multer.memoryStorage(); const upload = multer({ storage: storage});
但路由中使用的中间件实例名为upCSV:
router.post('/up', upCSV.single('csv'), newCamp);
如果你没有额外做const upCSV = upload的变量赋值,会导致该路由的Multer中间件未正常挂载,文件无法被解析。如果Postman测试时使用的是其他正确挂载了Multer的路由,就会出现两端表现不一致的情况。
2. 前端JS拦截表单提交处理异常
如果你在页面中写了JS代码监听表单submit事件,用异步请求(AJAX/axios/fetch)提交表单,需要检查两个点:
- 是否正确实例化
FormData对象,并将选中的文件追加到了FormData中 - 异步请求时是否手动设置了错误的
Content-Type头:浏览器会自动为FormData类型的请求添加正确的multipart/form-data头和边界标识,手动设置该头会导致边界信息丢失,Multer无法解析文件
3. 取消按钮默认触发空提交
你表单中的取消按钮未指定type="button",浏览器默认会将表单内无type属性的button识别为提交按钮。如果误点取消按钮提交表单,此时你大概率未选中文件,就会出现req.file为undefined的情况,修改按钮代码即可:
<button type="button" class="btn btn-warning mb-3">Cancelar</button>
4. Multer规则拦截文件
确认你是否在Multer配置中添加了额外规则:
- 若配置了
limits.fileSize限制文件大小,上传的CSV文件超出上限时会被Multer直接丢弃 - 若配置了
fileFilter过滤文件格式,规则不匹配的情况下也会导致文件被拦截,返回空的req.file
额外验证点
确认提交表单前已经在文件选择框中选中了有效的CSV文件,未选文件直接提交时req.file本身就是undefined,属于正常逻辑。
内容的提问来源于stack exchange,提问作者Jouio
相关产品推荐
相关产品推荐

