菜鸟问题:在为研究项目创建具有各种功能的网络服务器时,我遇到了文件上传到服务器的问题: 处理程序函数应检查文件大小,并返回重新渲染的上传网页以及附加错误消息。 如果文件大小稍大于限制,则可以正常工作。 但是,如果文件太大,它会默默地失败。
request.Body = http.MaxBytesReader(w, request.Body, 20 << 20)
if err := request.ParseMultipartForm(20 << 20); err != nil {
dataStruct.Errors = append(dataStruct.Errors, "image_too_large")
template.Execute(writer, dataStruct)
return
}
代码运行直到返回,没有任何错误表明模板解析失败,但在浏览器中页面未返回,状态为 (failed)net::ERR_CONNECTION_RESET
我使用了几个建议类似方法的不同教程作为指导 - 例如,https://tutorialedge.net/golang/go-file-upload-tutorial/
期望: 模板执行并返回带有附加消息的初始上传页面(在html模板中实现,由dataStruct.Errors中的“image_too_large”错误触发)
发生了什么: 当测试文件大小与限制相比相对较小,但仍然超过限制(22Mb 与 20Mb)时,一切都会正常工作。 当文件相当大时,(30Mb vs 20Mb)发生了上面描述的错误。
额外测试: 我还检查了模板渲染是否是问题(似乎不是) 当我将
template.Execute(writer, dataStruct)
与 http.Redirect(writer, request, "/", http.StatusSeeOther)
切换时,发生了同样的事情 - 稍大的文件重定向到根页面,并且文件相当大 - 错误。
预计会出现连接重置错误。
当超出服务器应用程序的请求限制时,服务器将停止读取请求正文并在写入响应后关闭网络连接。
如果客户端在读取任何响应之前写入整个请求(大多数情况都是如此),并且请求明显大于服务器应用程序的读取限制,则客户端在写入网络连接时将遇到连接重置错误。
如果客户端在遇到此错误后放弃(就像大多数人一样),则客户端永远不会读取服务器发送的响应。