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

ReactJS上传文件时FormData append后值为空的问题求助

问题解决方案

你遇到的问题由三个常见错误导致,对应修复方案如下:

1. 修复FormData为空的假象

你直接打印FormData实例默认不会输出内部存储的键值对,属于浏览器的正常表现,不是数据真的没有添加成功。你可以用formData.get('image')验证内容是否存在,也可以用如下代码遍历所有内容:

for (let [key, value] of formData.entries()) {
  console.log(key, value)
}

2. 移除手动设置的Content-Type

你在axios请求配置中手动指定了"Content-Type": "multipart/form-data",这个配置是错误的。multipart/form-data请求头必须附带浏览器自动生成的boundary分隔符,手动设置会覆盖掉正确的请求头,导致后端无法正常解析FormData内容。直接删除headers里的Content-Type配置即可,axios会自动为FormData类型的请求体设置正确的请求头。

3. 删除文件输入的value属性

你给type为file的CInput组件绑定了value={image}属性,文件类型的输入框不支持设置自定义value(仅支持设置为空字符串清空选择),该配置会导致文件选择行为异常。直接删除CInput上的value属性即可。

修正后代码示例

上传处理函数

const uploadFileHandler = async (e) => {
  const file = e.target.files[0];
  const formData = new FormData();
  formData.append("image", file);

  console.log(formData.get('image'));
  setUploading(true);

  try {
    const { data } = await axios.post(
      "/api/v1/uploads/primary",
      formData
    );
    setImage(data);
    setUploading(false);
  } catch (error) {
    console.error(error);
    setUploading(false);
  }
};

表单组件

<CFormGroup>
  <CLabel
    htmlFor="images"
    style={{ fontWeight: "bold", fontSize: 15 }}
  >
    Featured Image
  </CLabel>
  <CInput
    style={{ height: "calc(2em + 0.75rem + 2px)" }}
    accept="*"
    type="file"
    id="images"
    placeholder="Choose Featured Images"
    onChange={uploadFileHandler}
  />
  {uploading && (
    <div className="spinner-border text-primary" role="status">
      <span className="sr-only">Loading...</span>
    </div>
  )}
</CFormGroup>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 07:06:05