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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 19:32:16