使用React上传单文件时multer.single()失效但multer.array()正常,是什么原因?
问题根因
multer的single()和array()方法,上传成功后给请求对象挂载的文件字段格式完全不同:
- 使用
upload.array('pdf')时,文件会以数组形式挂载到req.files字段,你业务代码里写的req.files[0]可以正常获取到上传的文件 - 切换为
upload.single('pdf')后,单个文件会直接挂载到req.file字段,req.files会变为undefined,你convert.js第9行依然尝试读取req.files[0],自然就会抛出无法读取undefined的0属性的报错。
修复方案
根据你的业务需求二选一即可:
- 确定只需要单文件上传:保留
app.use(upload.single('pdf')),把convertToJPG方法里的req.files[0]替换为req.file - 想兼容多文件、单文件两种用法:修改业务代码的文件取值逻辑,增加兼容判断:
// 写在convert.js第9行原来取文件的位置 const uploadFile = req.files ? req.files[0] : req.file;
补充说明
你前端的React上传逻辑没有问题:虽然你用了循环遍历event.target.files来append文件,但你给input设置了multiple={false},每次只能选中一个文件,FormData里只会存在一个pdf字段,完全符合multer.single('pdf')的接收要求。
优化建议:不要把multer中间件全局挂载到app上,最好只给需要处理文件上传的接口单独添加该中间件,避免普通接口被多余的文件解析逻辑处理。
内容的提问来源于stack exchange,提问作者Kedar Karki
相关产品推荐
相关产品推荐

