no multipart boundary param
题目意思翻译为在Content-Type字段中没有multipart boundary param,这是我在使用go模拟http文件上传时出现的错误。也就是Header中的Content-Type缺少了个字段。
那么,这个multipart boundary param是什么?为什么需要放在Content-Type中?百度一下, 无果。谷歌一下,有了。
stackOverflow上说,这个参数是为了分割参数用的。也就是说你想通过form-data传递内容为:
name=John age=12
那么,你使用application/x-www-form-urlencoded传递时就是像使用这种格式传输的:
name=John&age=12
看到了吗,这里有一个&来分割不同的参数,而这个&又太有可能在要传递的参数中出现了,所以当我们使用multipart/form-data时需要重新定义一个分隔符,而这个也就是我们的主角。例如,他可以像这样出现在Header中:
multipart/form-data; boundary=64f412c27ba9f3e17283c9c32593a1defcff76dc71c7df04db8eab2da598
这个帖子还指出,它是可以用户自己定义的。可以自己定义吗?这么爽。
那么我们直接把上面的一串搞到header里,可是response里却报错说:"multipart: NextPart: EOF"
那他到底是能自己定义还是不能呢?来看看我给form-data写数据的部分代码:
//读取filePath对应的文件 file, err := os.Open(filePath) if err != nil { return err } defer file.Close() chunkBody := &bytes.Buffer{} //定义一个Writer writer := multipart.NewWriter(chunkBody) //变量的名字是file formFile, err := writer.CreateFormFile("file", "fileName") if err != nil { return err } //将要传送的文件内容复制到formFile这一变量中。 _, err = io.Copy(formFile, file) if err != nil { return err } chunkReq, err := http.NewRequest("POST", chunkUrl, chunkBody) chunkReq.Header.Set("Content-Type", writer.FormDataContentType())
这里可看到我们通过writer将要传送的数据写入进去,那么我大胆猜测writer变量自己定义了分隔符,所以在设置header时才可以直接用writer.FormDataContentType()。
本人懒了,只能写到这里了,想要验证的小伙伴自己搞搞吧,或者来私信炸我。
参考博客:https://stackoverflow.com/questions/3508338/what-is-the-boundary-in-multipart-form-data