我有一个简单的多部分表单,可以上传到 Go 应用程序。我想对上传大小设置限制,因此我执行了以下操作:func myHandler(rw http.ResponseWriter, request *http.Request){ request.Body = http.MaxBytesReader(rw, request.Body, 1024) err := request.ParseMultipartForm(1024) if err != nil{ // Some response. } } 每当上传超过最大大小时,我都会重置连接,如下所示:然而代码继续执行。我似乎无法向用户提供任何反馈。我宁愿说“您已超出大小限制”,而不是切断连接。这可能吗?
2 回答
12345678_0001
TA贡献1802条经验 获得超5个赞
此代码按预期工作。说明http.MaxBytesReader
MaxBytesReader 类似于 io.LimitReader 但旨在限制传入请求正文的大小。与 io.LimitReader 不同,MaxBytesReader 的结果是 ReadCloser,对于超出限制的 Read 返回非 EOF 错误,并在调用其 Close 方法时关闭底层读取器。
MaxBytesReader 防止客户端意外或恶意发送大请求并浪费服务器资源。
您可以使用io.LimitReader
仅读取 N 个字节,然后自行处理 HTTP 请求。
繁星淼淼
TA贡献1775条经验 获得超11个赞
强制客户端停止发送数据的唯一方法是强行关闭连接,这就是您正在使用的http.MaxBytesReader
.
您可以使用io.LimitReader
包装在 a 中的ioutil.NopCloser
,并将错误状态通知客户端。然后您可以检查更多数据,并尝试将连接排空到另一个限制以保持打开状态。但是,MaxBytesReader
在这种情况下,未正确响应的客户端也可能无法正常工作。
处理此类事情的优雅方式是使用Expect: 100-continue
,但这仅适用于 Web 浏览器以外的客户端。
- 2 回答
- 0 关注
- 214 浏览
添加回答
举报
0/150
提交
取消