我有一个简单的多部分表单,可以上传到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.
}
}
然后代码继续执行。我似乎无法向用户提供任何反馈。我没有切断连接,而是更喜欢说"你超过了尺寸限制"。这可能吗?
答案 0 :(得分:4)
此代码按预期工作。 http.MaxBytesReader
MaxBytesReader与io.LimitReader类似,但适用于 限制传入请求主体的大小。与之相反 io.LimitReader,MaxBytesReader的结果是一个ReadCloser,返回一个 读取超出限制的非EOF错误,并关闭基础 读者在调用Close方法时。
MaxBytesReader可防止客户意外或恶意 发送大量请求并浪费服务器资源。
您可以使用io.LimitReader
只读取N个字节,然后自行处理HTTP请求。
答案 1 :(得分:3)
强制客户端停止发送数据的唯一方法是强制关闭连接,这就是您使用http.MaxBytesReader
所做的事情。
您可以使用io.LimitReader
中包含的ioutil.NopCloser
,并通知客户端错误状态。然后,您可以检查更多数据,并尝试将连接排除到另一个限制以保持打开状态。但是,对 19500101 20.7
19510101 230.1
19520101 -91.8
19530101 20.0
没有正确响应的客户端在这种情况下可能也不起作用。
处理这类事情的优雅方式是使用MaxBytesReader
,但这只适用于除Web浏览器以外的客户端。