如何使用multer上传不同字段名的单文件与多文件数组?
multer多字段上传解决方案
错误原因
你当前的写法将upload.single('mainimg')和upload.array('sideimgs')两个multer中间件叠加使用,multer的单个上传中间件会完整消费整个multipart/form-data请求体,第二个中间件读取时请求体已被处理完毕,自然无法识别对应字段,抛出unexpected field错误。
正确实现
你的HTML表单代码无需修改,仅需调整Node.js端的multer中间件配置即可,使用multer内置的fields()方法处理多不同字段的文件上传:
const storage = multer.diskStorage({ destination: function(req, file, cb) { cb(null,'../public/prodImgs/') }, filename: function(req, file, cb) { const newName = Date.now() + '-' + Math.round(Math.random() * 100) cb(null,file.fieldname + '-' + newName) } }); const upload = multer({ storage: storage }); // 直接在路由处配置fields,指定接收的字段名和对应最大数量 app.post('/addprod', upload.fields([ {name: 'mainimg', maxCount: 1}, // 主图最多1张 {name: 'sideimgs', maxCount: 10} // 侧边图最多10张,可按需调整 ]), async (req, res) =>{ // 主图文件:req.files.mainimg[0] // 侧边图数组:req.files.sideimgs console.log(req.files,"\n\n\n") console.log(req.body) });
注意事项
- 若不需要限制侧边图的上传数量,也可以使用
upload.any(),但该方法会接收所有字段的文件,安全性更低,不推荐生产环境使用 - 文件上传后的所有信息都存储在
req.files中,普通表单字段仍存储在req.body中
内容的提问来源于stack exchange,提问作者thekensiwo
相关产品推荐
相关产品推荐

