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
相关产品推荐
相关产品推荐

