2 回答
TA贡献1812条经验 获得超5个赞
我设法解决了我的问题,所以在这里以防其他人需要它。并感谢@JiangYD 提供使用 curl 测试服务器的技巧。
TL; 博士
我写了,http.HandleFunc("/submit/", submit)但我正在向/submit(注意缺少的斜线)发出 POST 请求<<这很重要,因为重定向
不要自己指定 Content-Type,浏览器会为你做
长答案
我按照@JiangYD 说的做了,并使用curl 来测试服务器,我用响应更新了我的答案。我发现奇怪的是有一个 301 重定向,因为我没有把它放在那里,我决定使用以下 curl 命令
curl -v -F 'uploadFile=@\"C:/Users/raul-/Desktop/test.png\"' -L http://localhost:8080/submit
(注意-L)那样 curl 跟随重定向,尽管它再次失败,因为在重定向时,curl 从 POST 切换到 GET 但通过该响应我发现请求/submit被重定向到/submit/,我记得我是这样写的它在main函数中。
在修复它仍然失败后,响应是http: no such file并且通过查看net/http代码我发现这意味着该字段不存在,因此我对获得的所有字段名称进行了快速迭代:
for k, _ := range r.MultipartForm.File {
log.Println(k)
}
我得到'uploadFile了字段名称,我删除了 curl 命令中的单引号,现在它完美地上传了文件
但这并没有结束,我现在知道服务器工作正常,因为我可以使用上传文件,curl但是当我尝试通过托管网页上传文件时,出现错误:no multipart boundary param in Content-Type.
所以我发现我应该在标题中包含边界,我将 fetch 更改为这样的:
fetch('/submit', {
method: 'post',
headers: {
"Content-Type": "multipart/form-data; boundary=------------------------" + boundary
}, body: formData})
我像这样计算边界:
var boundary = Math.random().toString().substr(2);
但是我还是有一个错误:multipart: NextPart: EOF那么你如何计算边界?我阅读了规范https://html.spec.whatwg.org/multipage/forms.html#multipart/form-data-encoding-algorithm并发现边界是由对文件进行编码的算法计算的,在我的情况下是 FormData,FormData API 没有公开获取该边界的方法,但我发现浏览器会multipart/form-data自动添加 Content-Type with和边界,如果您不指定它,所以我从fetch调用中删除了 headers 对象和现在它终于起作用了!
TA贡献1793条经验 获得超6个赞
完全删除标题实际上有效。尤其是通过 fetch 或 axios 发送请求时。
axios.post(
endpoint + "/api/v1/personalslip",
{
newSlip
},
{
}
)
.then(res => {
console.log(res);
});
- 2 回答
- 0 关注
- 181 浏览
添加回答
举报