我正在嘗試讓一個用 go 撰寫的服務器以“mime/multipart”表單回應“mime/multipart”表單。
使用下面的代碼,我得到 Uncaught (in promise) TypeError: Could not parse content as FormData.
我的 go 看起來像這樣:
package main
import (
"log"
"mime/multipart"
"net/http"
)
func handler(resp http.ResponseWriter, req *http.Request) {
req.ParseMultipartForm(2097152)
mw := multipart.NewWriter(resp)
mw.WriteField("name", req.FormValue("user_name"))
mw.WriteField("email", req.FormValue("user_email"))
mw.WriteField("message", req.FormValue("user_message"))
resp.Header().Set("Content-Type", mw.FormDataContentType())
mw.Close()
}
func main() {
http.HandleFunc("/", handler)
log.Fatal(http.ListenAndServe(":8080", nil))
}
我的瀏覽器代碼如下所示:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Your first HTML form</title>
<link rel="stylesheet" href="form.css">
</head>
<body>
<form name="theForm" method="post">
<ul>
<li>
<label for="name">Name:</label>
<input type="text" id="name" name="user_name">
</li>
<li>
<label for="mail">E-mail:</label>
<input type="email" id="mail" name="user_email">
</li>
<li>
<label for="msg">Message:</label>
<textarea id="msg" name="user_message"></textarea>
</li>
<li class="button">
<button type="submit">Send your message</button>
</li>
</ul>
</form>
<pre id="response"></pre>
<script>
const form = document.forms["theForm"];
form.addEventListener( 'submit', function ( event ) {
event.preventDefault();
const fd = new FormData(form);
fetch('/form-handler', {
method: 'POST',
body: fd
})
.then(response => response.formData())
.then(data => document.getElementById("response").innerText = JSON.stringify(data));
});
</script>
</body>
</html>
如果我將 JavaScript 更改為.then(response => response.text),我會得到看起來正確的回應,所以不確定最后是否缺少 CRLF 或什么?
uj5u.com熱心網友回復:
您必須移動resp.Header().Set("Content-Type", mw.FormDataContentType())到第一個寫入的上方。像這樣:
func handler(resp http.ResponseWriter, req *http.Request) {
req.ParseMultipartForm(2097152)
mw := multipart.NewWriter(resp)
resp.Header().Set("Content-Type", mw.FormDataContentType())
mw.WriteField("name", req.FormValue("user_name"))
mw.WriteField("email", req.FormValue("user_email"))
mw.WriteField("message", req.FormValue("user_message"))
mw.Close()
}
在第一次寫入ResponseWriter. 如果Content-Type此時設定為no ,則默認Content-Type: text/plain; charset=utf-8瀏覽器無法決議,因為它需要Content-Type標題中給出的邊界
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/419703.html
標籤:
