淘先锋技术网

首页 1 2 3 4 5 6 7

基础不好真的难受,这点问题折腾半天…

网上看到很多单独解析文件的,网上的资料确实都能找到。但是结合gin解析文件和json字符串(或其他类型的参数,但字符串最好)一起的,就不好找。

需求是前端使用Content-Type: multipart/form-data的形式上传文件以及需要的参数。后端使用golang 的gin 框架解析这两种参数。

零零散散的找了一晚上资料,总算解决了。

前端参数传输要求

例如我使用axios,重点是对象得转成json字符串去传输,因为在formdata形势下axios不会帮忙转化为字符串了。

    let formData = new FormData();
    // img.file是个文件对象
    formData.append("file", img.file);
    // img.color是个结构体,需要转成json字符串
    formData.append("color", JSON.stringify(img.color));
    // 这里甚至不需要指定Content-Type: multipart/form-data请求头,它会自动识别
    return post<string>(baseUrl + "cardChangeBGColor", formData);

gin解析

有两种方式:

//c 是 *gin.Context
// 直接用PostForm就能获取json字符串
colorStr := c.PostForm("color")
// 然后转成byte数组去解析
json.Unmarshal([]byte(colorStr), &(ch.Color))

还有一种,这种比较细,折磨了一晚上

c.Request.ParseMultipartForm(2<<10)
colorStr := c.Request.FormValue("color")
json.Unmarshal([]byte(colorStr), &(ch.Color))
fileRead, file, err := c.Request.FormFile("file")

这里的细节是使用ParseForm还是ParseMultipartForm的问题,一般使用可能没注意,感觉都没啥区别,如果仅仅是解析文件,那么两个都能用,但是你还想c.Request.FormValue("color")这样获取不是文件类型的参数,那么这里就必须使用ParseMultipartForm。否则只能读取到文件。

所以,这里建议直接使用 c.PostForm("color")更简单点。

折磨!