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 關注
- 245 瀏覽
添加回答
舉報