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

JavaScript通过Axios上传文件Go后端MultipartForm为nil问题求助

问题原因
  • 前端配置错误:使用Axios发送FormData请求时,手动指定了Content-Type: multipart/form-data头,但没有携带必填的边界(boundary)参数。浏览器发送FormData请求时会自动生成带正确boundary的Content-Type头,手动覆盖会导致后端无法正确拆分表单字段。
  • Go后端未主动解析请求:Go标准库net/http不会自动解析multipart类型的请求体,直接读取r.MultipartForm会返回nil,必须先调用解析方法。
解决方法

1. 修改前端JS代码

删除手动设置的Content-Type头,让浏览器自动处理即可:

const testPost = async (files) => {
  let formData = new FormData();

  files.forEach((file) => {
    formData.append("file", file);
  });

  const res = await axios({
    method: "POST",
    url: baseUrl,
    data: formData,
    // 移除手动设置的Content-Type配置
  });

  return res;
};

2. 修改Go后端代码

先调用ParseMultipartForm方法解析请求体,再读取表单和文件内容:

func (h *SendHandler) TestPost(w http.ResponseWriter, r *http.Request) {
    //Allow CORS here By * or specific origin
    w.Header().Set("Access-Control-Allow-Origin", "*")
    w.Header().Set("Access-Control-Allow-Headers", "Content-Type")

    // 解析multipart表单,参数为最大内存占用(示例为10MB,超出部分会写入临时磁盘文件)
    err := r.ParseMultipartForm(10 << 20)
    if err != nil {
        w.WriteHeader(http.StatusBadRequest)
        return
    }

    formdata := r.MultipartForm
    fmt.Println(formdata)

    // 读取上传文件列表示例
    fileList := r.MultipartForm.File["file"]
    for _, f := range fileList {
        // 打开文件即可获取内容进行后续处理
        file, err := f.Open()
        if err != nil {
            continue
        }
        defer file.Close()
        fmt.Printf("接收文件:%s,文件大小:%d字节\n", f.Filename, f.Size)
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 22:06:02