我正在尝试在上传文件时对文件大小实现限制。只要文件(或者更确切地说是请求正文,但对于我的目的而言足够接近)大于 1 MB,以下代码就会正确检测到。但是,如果是这种情况,返回的页面是“连接已重置”页面,而不是带有我的自定义错误消息的页面。如果文件小于 1 MB,我会正确地看到一个页面,显示“文件上传正常”。
我希望得到一些关于为什么重置与服务器的连接而不是提供我在下面的代码中指定的内容的指示。
func baseHandler(writer http.ResponseWriter, request *http.Request) {
request.Body = http.MaxBytesReader(writer, request.Body, 1024 * 1024)
_, _, err := request.FormFile("uploadfile")
if err != nil {
fmt.Fprintf(writer, "ERROR: %v", err) // Should be displayed in browser, is not
fmt.Printf("ERROR: %v", err) // Gets written to terminal, so any errors are correctly identified
return
}
fmt.Fprintf(writer, "File upload OK")
}
func main() {
http.HandleFunc("/", baseHandler)
http.ListenAndServe(":8080", nil)
}
最佳答案
服务器确实写入了响应。问题是客户端没有读取响应。
当超出 MaxBytesReader 限制时,服务器将停止从客户端读取数据。此外,服务器在将响应写入客户端后半秒完全关闭连接。
许多 HTTP 客户端在读取响应之前写入完整的请求正文,并在写入请求正文时出现任何错误时停止。当请求正文足够大时,这些客户端会报告“连接重置”错误等,并忽略服务器写入的响应。
服务器代码指针:当超出 MaxBytesReader 限制时,响应的 requestBodyLimitHit
字段设置为 true
。所有相关代码都接近该字段的使用。
关于http - 去 http.MaxBytesReader 重置连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43777433/