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

React提交表单到Node服务无法上传图片,应如何实现文件上传功能?

React文件上传功能修复方案

问题根因

  • 文件类型输入(<input type="file"/>)的选中内容不会存在input.value属性中,你当前的代码将文件输入的value(仅为本地虚拟路径字符串,无实际文件内容)存入了state,最终append到FormData的是无效字符串,后端无法识别为文件。
  • Postman是直接选中真实文件对象提交,所以可以正常上传。

修复步骤

1. 调整handleChange逻辑,区分普通输入和文件输入

修改你的handleChange函数,当识别到是文件类型输入时,读取input.files[0](即选中的File对象)存入state:

// 修改后的handleChange
handleChange = ({ currentTarget: input }) => {
    const errors = { ...this.state.errors }
    const errorMessage = this.validateProperty(input)
    if (errorMessage) errors[input.name] = errorMessage
    else delete errors[input.name]

    const data = { ...this.state.data }
    // 新增文件输入判断逻辑
    if (input.type === "file") {
      data[input.name] = input.files[0];
    } else {
      data[input.name] = input.value;
    }
    this.setState({ data, errors })
  }

2. 确认文件输入框配置

保证你的文件上传输入框的name属性值为image,和state中存储的key匹配:

<input type="file" name="image" accept="image/*" onChange={this.handleChange}/>

3. 检查请求配置

确认saveEmployee方法提交FormData时,不要手动设置Content-Type: multipart/form-data请求头,浏览器会自动给FormData请求添加该头并生成对应的分隔符boundary,手动设置会导致分隔符缺失,后端无法解析文件。
正确的请求示例(以axios为例):

const saveEmployee = (formData) => {
  // 不需要额外配置headers
  return axios.post("/api/employees", formData);
}

完成以上修改后即可正常提交图片文件。

内容的提问来源于stack exchange,提问作者AhmedHosny

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 17:36:03