基础不好真的难受,这点问题折腾半天…
网上看到很多单独解析文件的,网上的资料确实都能找到。但是结合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")
更简单点。
折磨!