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

全部评论
感谢大佬的分享,很欣赏写代码有注释的,哈哈哈
1 回复 分享
发布于 2022-07-15 11:24

相关推荐

coffrar:全都是已读😅沟通一千五百多个了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务