如何使用Multer与MongoDB实现多字段图片上传?
解决Multer多字段图片上传+MongoDB存文件名的问题
你当前的核心问题是没正确区分多字段上传的文件,且upload.any()的用法不够严谨。直接给你落地的解决方案:
关键调整点
- 用
upload.fields()替代upload.any(),明确指定要接收的上传字段名,既安全又能精准获取对应文件 - 从
req.files(复数)里分别提取coverimg和mainimg的文件对象,而非用只能获取单个文件的req.file(单数)
修改后的完整代码
const storage = multer.diskStorage({ destination: (req, file, cb) => { // 修正你原代码的参数错误:第二个参数是file而非res cb(null, dir) }, filename: (req, file, cb) => { cb(null, Date.now() + file.originalname) } }) const upload = multer({ storage: storage }) // 用fields指定需要处理的两个上传字段 router.post('/', upload.fields([{ name: 'coverimg' }, { name: 'mainimg' }]), async (req, res) => { // 分别获取两个字段的文件名,未上传时用默认值 const coverImgName = req.files?.coverimg?.[0]?.filename || 'Black.jpg'; const mainImgName = req.files?.mainimg?.[0]?.filename || 'Black.jpg'; const business = new Business({ name: req.body.name, type: req.body.type, phone: req.body.phone, address: req.body.address, coverimg: coverImgName, mainimg: mainImgName }) try { const newBusiness = await business.save() res.status(201).json(newBusiness) } catch (err) { res.status(400).json({ message: err.message }); } })
额外说明
- 修正了
diskStorage里的参数错误,destination的第二个参数是file,原代码写为res会导致回调异常 upload.fields()仅处理指定字段的上传,比upload.any()更安全,避免接收恶意文件req.files是对象结构,键为字段名,值是对应字段的文件数组(单文件上传也会以数组形式返回),因此用req.files.coverimg[0].filename获取文件名- 用可选链操作符
?.避免字段不存在时抛出错误,同时设置默认值Black.jpg
内容的提问来源于stack exchange,提问作者ieatglue
相关产品推荐
相关产品推荐

