前端使用Multer多图上传至数据库失败,寻求解决办法
问题分析与解决方案
你的前端代码核心问题是请求体格式错误:你把FormData嵌套在了普通JS对象里发送,这会导致后端无法正确解析multipart/form-data格式的请求,自然拿不到photos文件和其他字段。
具体错误点
- 构造
FormData后,你又把它放到了{ ...info, data, featured, rooms }对象中,axios会把这个对象序列化为JSON,而非按multipart/form-data格式发送。 - 手动设置
"Content-Type": "multipart/form-data"是多余的,反而会破坏axios自动添加的boundary分隔符(multipart请求必须依赖这个分隔符分割不同字段)。
修正步骤
所有需要发送的数据(普通字段+文件)都要直接追加到FormData中,然后把FormData作为axios.post的第二个参数直接发送:
- 遍历
info对象,把所有键值对追加到FormData - 把
featured、rooms这类单独字段也追加到FormData - 移除手动设置的Content-Type头,让axios自动处理
修正后的前端代码
const handleHotelSubmit = async (e) => { e.preventDefault(); const formData = new FormData(); // 追加info里的所有普通字段 Object.entries(info).forEach(([key, value]) => { formData.append(key, value); }); // 追加单独字段,rooms如果是数组/对象要转成字符串 formData.append('featured', featured); formData.append('rooms', JSON.stringify(rooms)); // 追加图片文件 Object.values(photos).map((photo) => formData.append("photos", photo)); setIsLoading(true); try { await axios.post(`/hotels`, formData); } catch (err) { setError(err.message); } setIsLoading(false); };
补充说明
- 如果
rooms是数组或对象类型,后端接收后需要用JSON.parse()解析,因为FormData只能传递字符串或Blob/File类型。 - 后端Multer配置是正确的(Postman测试已验证),前端按正确格式发送后,就能正常解析
req.files.photos和其他字段。
内容的提问来源于stack exchange,提问作者Djela Srca
相关产品推荐
相关产品推荐

