You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

前端使用Multer多图上传至数据库失败,寻求解决办法

问题分析与解决方案

你的前端代码核心问题是请求体格式错误:你把FormData嵌套在了普通JS对象里发送,这会导致后端无法正确解析multipart/form-data格式的请求,自然拿不到photos文件和其他字段。

具体错误点

  1. 构造FormData后,你又把它放到了{ ...info, data, featured, rooms }对象中,axios会把这个对象序列化为JSON,而非按multipart/form-data格式发送。
  2. 手动设置"Content-Type": "multipart/form-data"是多余的,反而会破坏axios自动添加的boundary分隔符(multipart请求必须依赖这个分隔符分割不同字段)。

修正步骤

所有需要发送的数据(普通字段+文件)都要直接追加到FormData中,然后把FormData作为axios.post的第二个参数直接发送:

  1. 遍历info对象,把所有键值对追加到FormData
  2. 把featured、rooms这类单独字段也追加到FormData
  3. 移除手动设置的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 18:31:07