我一直在尝试在Go中设置一个HTTP服务器,允许用户通过HTML表单上传文件。由于其他原因,该表单也会有文本输入。然而,在提交表单时,我的浏览器报告连接已重置(我尝试过Firefox和Chromium),检查显示服务器在重置之前甚至没有到达上传端点的处理函数,奇怪的是,当表单中只有文件和提交时,这种情况不会发生。
下面是一个最小的复制:
package main
import (
"fmt"
"net/http"
)
func showPage(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w,
`<!DOCTYPE html>
<html>
<body>
<form enctype="multipart/form-data" action="/upload">
<input type="file" name="file" />
<input type="text" name="lol" />
<input type="submit" value="upload" />
</form>
</body>
</html>`)
}
func uploadHandler(w http.ResponseWriter, r *http.Request) {
fmt.Println("yay!")
fmt.Fprint(w, "yay!")
}
func main() {
http.HandleFunc("/", showPage)
http.HandleFunc("/upload/", uploadHandler)
http.ListenAndServe(":8080", nil)
}
字符串
运行上面的代码并在http://localhost:8080/
的表单中提交一个文件,应该会在服务器的控制台上显示一个“yay!”页面并打印“yay!”。相反,在提交一个足够大的文件时(非常小的文件不会导致问题),连接重置,控制台上没有任何内容。This 5MB audio sample足够大,对我来说会导致问题。
如果表单中的唯一输入是文件,出于某种原因,一切都运行得很好。
1条答案
按热度按时间toe950271#
处理程序不读取任何请求体。
在从处理程序返回时,当未读请求主体的大小大于262,144字节时,net/http服务器关闭连接。
客户端在尝试写入请求正文时接收到连接重置。客户端在阅读响应之前出错。
通过阅读请求体来修复。假设您需要一个多部分表单,那么调用ParseMultipartForm是读取请求体的最简单方法。
字符串