http 文件上传处理程序在文件太大的情况下会默默失败(尽管有检查来限制响应大小)

问题描述 投票:0回答:1

菜鸟问题:在为研究项目创建具有各种功能的网络服务器时,我遇到了文件上传到服务器的问题: 处理程序函数应检查文件大小,并返回重新渲染的上传网页以及附加错误消息。 如果文件大小稍大于限制,则可以正常工作。 但是,如果文件太大,它会默默地失败。

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)
切换时,发生了同样的事情 - 稍大的文件重定向到根页面,并且文件相当大 - 错误。

go http file-upload webserver
1个回答
0
投票

预计会出现连接重置错误。

当超出服务器应用程序的请求限制时,服务器将停止读取请求正文并在写入响应后关闭网络连接。

如果客户端在读取任何响应之前写入整个请求(大多数情况都是如此),并且请求明显大于服务器应用程序的读取限制,则客户端在写入网络连接时将遇到连接重置错误。

如果客户端在遇到此错误后放弃(就像大多数人一样),则客户端永远不会读取服务器发送的响应。

© www.soinside.com 2019 - 2024. All rights reserved.