Golang注册接口添文件上传遇JSON解析错误的解决求助
解决Go中文件上传时"invalid character '-' in numeric literal"错误
问题根源
这个错误本质是你用JSON解析器去处理了非JSON格式的请求数据。文件上传必须使用multipart/form-data格式,而你之前的代码只支持application/json解析,强行用JSON解析multipart数据就会触发字符解析错误。
可行解决方案
直接重构注册控制器的请求处理逻辑,适配multipart/form-data格式,步骤如下:
1. 解析multipart表单
在处理请求前,先调用r.ParseMultipartForm解析表单数据,参数设置合理的最大内存限制(比如10<<20代表10MB)。
2. 分离普通字段与上传文件
用r.FormValue获取普通文本字段,用r.FormFile获取上传的文件对象。
代码示例
原JSON解析代码(错误示例)
func RegisterHandler(w http.ResponseWriter, r *http.Request) { var user User err := json.NewDecoder(r.Body).Decode(&user) if err != nil { // 触发invalid character '-'错误 http.Error(w, err.Error(), http.StatusBadRequest) return } // 后续逻辑... }
修改后的multipart处理代码
type User struct { Username string Email string // 其他业务字段... } func RegisterHandler(w http.ResponseWriter, r *http.Request) { // 解析multipart表单,设置10MB内存限制 err := r.ParseMultipartForm(10 << 20) if err != nil { http.Error(w, "表单解析失败", http.StatusBadRequest) return } // 获取普通文本字段 username := r.FormValue("username") email := r.FormValue("email") if username == "" || email == "" { http.Error(w, "必填字段不能为空", http.StatusBadRequest) return } // 获取上传文件 file, fileHeader, err := r.FormFile("avatar") if err != nil { http.Error(w, "文件获取失败", http.StatusBadRequest) return } defer file.Close() // 保存文件到本地示例 saveDir := "./uploads/" if err := os.MkdirAll(saveDir, 0755); err != nil { http.Error(w, "创建保存目录失败", http.StatusInternalServerError) return } dstFile, err := os.Create(saveDir + fileHeader.Filename) if err != nil { http.Error(w, "文件保存失败", http.StatusInternalServerError) return } defer dstFile.Close() _, err = io.Copy(dstFile, file) if err != nil { http.Error(w, "文件保存失败", http.StatusInternalServerError) return } // 后续业务逻辑:创建用户、返回响应等 w.WriteHeader(http.StatusOK) fmt.Fprintf(w, "注册成功,已上传文件:%s", fileHeader.Filename) }
Postman请求正确设置
- 请求方法:POST
- 请求URL:你的注册接口地址
- 选择
Body->form-data - 添加字段:
- 普通字段:例如
username(类型选Text)、email(类型选Text) - 文件字段:例如
avatar(类型选File),选择本地待上传文件
- 普通字段:例如
关键注意点
- 不要手动设置Content-Type为
application/json,Postman选择form-data后会自动生成正确的multipart/form-data请求头 - 代码中获取字段的名称必须和Postman里的字段名完全一致
- 提前创建文件保存目录(如示例中的
./uploads/),避免因目录不存在导致保存失败
内容的提问来源于stack exchange,提问作者Melly
相关产品推荐
相关产品推荐

