Javascript 使用go处理文件上载
我最近才开始玩围棋,所以我还是个笨蛋,如果我犯了太多的错误,我很抱歉。我一直试图解决这个问题很长一段时间,但我只是不明白发生了什么。在我的main.go文件中,我有一个主要功能:Javascript 使用go处理文件上载,javascript,html,http,go,multipartform-data,Javascript,Html,Http,Go,Multipartform Data,我最近才开始玩围棋,所以我还是个笨蛋,如果我犯了太多的错误,我很抱歉。我一直试图解决这个问题很长一段时间,但我只是不明白发生了什么。在我的main.go文件中,我有一个主要功能: func main() { http.HandleFunc("/", handler) http.HandleFunc("/submit/", submit) log.Fatal(http.ListenAndServe(":8080", nil)) } 处理程序函数如下所示: func han
func main() {
http.HandleFunc("/", handler)
http.HandleFunc("/submit/", submit)
log.Fatal(http.ListenAndServe(":8080", nil))
}
处理程序函数如下所示:
func handler(w http.ResponseWriter, r *http.Request) {
data, _ := ioutil.ReadFile("web/index.html")
w.Write(data)
}
func submit(w http.ResponseWriter, r *http.Request) {
log.Println("METHOD IS " + r.Method + " AND CONTENT-TYPE IS " + r.Header.Get("Content-Type"))
r.ParseMultipartForm(32 << 20)
file, header, err := r.FormFile("uploadFile")
if err != nil {
json.NewEncoder(w).Encode(Response{err.Error(), true})
return
}
defer file.Close()
out, err := os.Create("/tmp/file_" + time.Now().String() + ".png")
if err != nil {
json.NewEncoder(w).Encode(Response{err.Error(), true})
return
}
defer out.Close()
_, err = io.Copy(out, file)
if err != nil {
json.NewEncoder(w).Encode(Response{err.Error(), true})
return
}
json.NewEncoder(w).Encode(Response{"File '" + header.Filename + "' submited successfully", false})
}
function upload() {
fetch('/submit', {
method: 'post',
headers: {
"Content-Type": "multipart/form-data"
},
body: new FormData(document.querySelector('#form')
}).then(function json(response) {
return response.json()
}).then(function(data) {
window.console.log('Request succeeded with JSON response', data);
}).catch(function(error) {
window.console.log('Request failed', error);
});
}
<form id="form" method="post" enctype="multipart/form-data" action="/submit"><input id="file-input" type="file" name="uploadFile" /></form>
fetch('/submit', {
method: 'post',
headers: {
"Content-Type": "multipart/form-data; boundary=------------------------" + boundary
}, body: formData})
var boundary = Math.random().toString().substr(2);
我知道这不是为网站服务的最佳方式
提交函数如下所示:
func handler(w http.ResponseWriter, r *http.Request) {
data, _ := ioutil.ReadFile("web/index.html")
w.Write(data)
}
func submit(w http.ResponseWriter, r *http.Request) {
log.Println("METHOD IS " + r.Method + " AND CONTENT-TYPE IS " + r.Header.Get("Content-Type"))
r.ParseMultipartForm(32 << 20)
file, header, err := r.FormFile("uploadFile")
if err != nil {
json.NewEncoder(w).Encode(Response{err.Error(), true})
return
}
defer file.Close()
out, err := os.Create("/tmp/file_" + time.Now().String() + ".png")
if err != nil {
json.NewEncoder(w).Encode(Response{err.Error(), true})
return
}
defer out.Close()
_, err = io.Copy(out, file)
if err != nil {
json.NewEncoder(w).Encode(Response{err.Error(), true})
return
}
json.NewEncoder(w).Encode(Response{"File '" + header.Filename + "' submited successfully", false})
}
function upload() {
fetch('/submit', {
method: 'post',
headers: {
"Content-Type": "multipart/form-data"
},
body: new FormData(document.querySelector('#form')
}).then(function json(response) {
return response.json()
}).then(function(data) {
window.console.log('Request succeeded with JSON response', data);
}).catch(function(error) {
window.console.log('Request failed', error);
});
}
<form id="form" method="post" enctype="multipart/form-data" action="/submit"><input id="file-input" type="file" name="uploadFile" /></form>
fetch('/submit', {
method: 'post',
headers: {
"Content-Type": "multipart/form-data; boundary=------------------------" + boundary
}, body: formData})
var boundary = Math.random().toString().substr(2);
下面是HTML:
<input id="file-input" type="file" name="uploadFile" />
当使用curl时,我正在运行的控制台没有输出任何内容。我设法解决了我的问题,所以这里是为了防止其他人需要它。感谢@jiangid提供了使用curl测试服务器的技巧 TL;博士
- 我写了
,但我向http.HandleFunc(“/submit/”,submit)
(请注意缺少的斜杠)发出了一个POST请求,完全删除标题实际上是可行的。尤其是通过fetch或axios发送请求时/submit
axios.post( endpoint + "/api/v1/personalslip", { newSlip }, { } ) .then(res => { console.log(res); });
第一步,使用curl检查服务器是否正常。您需要在表单标签上设置method和enctype属性。输入标记与GET/POST决策、多部分编码和内容类型设置无关。@Volker我认为在fetch中指定
和method:POST
就足够了,我不需要标记,但我也尝试使用了类似于header:{'content-type':'multipart/form data'}
的标记,然后,我使用
以该表单提交数据,但这不起作用,所以我想这一定是其他原因。@jiangid当我使用运行newformdata
不记录任何内容,就好像提交功能从未运行过一样。我正在使用这个命令:go-run main的控制台时。go
在Windows中。我得到一个永久移动的curl-v-F'uploadFile=@\'C:/Users/raul-/Desktop/test.png\'http://localhost:8080/submit
响应,并在发送结束前说HTTP/1.1 301
,这可能解释了为什么提交功能没有运行。@Jingid我用整个curl输出更新了我的问题,以备您需要更多信息。感谢您的洞察力。帮了我很多忙。“注意那条丢失的斜线”救了我一天。请强调您的注释,因为这可能是罪魁祸首-+1HTTP错误,停止发送