go - 限制 FormFile 中的文件大小

标签 go

我让用户使用 FormFile 上传文件。我应该在什么时候检查文件大小是否太大。当我做的时候

 file, header, fileErr := r.FormFile("file")

一个文件对象已经创建。那么我是否已经产生了阅读整个文件的成本?

https://golang.org/pkg/net/http#Request.FormFile

最佳答案

使用http.MaxBytesReader限制从请求中读取的字节数。在调用 ParseMultiPartForm 或 FormFile 之前,执行这一行:

 r.Body = http.MaxBytesReader(w, r.Body, max)

其中 r*http.Requestwhttp.Response

MaxBytesReader 限制为整个 请求正文而不是单个文件读取的字节数。当只有一个文件上传时,请求正文大小的限制可以很好地近似于文件大小的限制。如果您需要对一个或多个文件实现特定限制,请将 MaxBytesReader 限制设置得足够大以应对所有预期的请求数据并检查 FileHeader.Size对于每个文件。

当超出 http.MaxBytesReader 限制时,服务器会停止读取请求并在处理程序返回后关闭连接。

如果您想限制使用的内存量而不是请求体大小,请调用 r.ParseMultipartForm(maxMemory)在调用 r.FormFile() 之前。这将为文件部分使用最多 maxMemory 字节,其余部分存储在磁盘上的临时文件中。此调用不限制从客户端读取的总字节数或上传文件的大小。

检查 request Content-Length header 不起作用有两个原因:

  • 没有为分 block 请求主体设置内容长度。
  • 服务器可以读取整个请求主体以支持连接保持事件。突破 MaxBytesReader 限制是确保服务器停止读取请求正文的唯一方法。

关于go - 限制 FormFile 中的文件大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28073395/

相关文章:

multithreading - 更改 map 数据时如何防止死锁

golang : Read multiline error response from smtp. 发送邮件

go - 使用其他文件的功能是其他目录Golang

GoLang 和 MySQL 数据库

go - go : different output on named return value 中的闭包

google-app-engine - 更新 AppEngine 中每个实例的内存缓存(自动扩展)

go - 按给定 slice 对 slice 字符串进行排序/排序

go - 如何获取无缓冲 channel 中的元素数量

string - 文本/模板如何确定 map 的 "default textual representation"?

go - mgo中如何对数组元素进行多级拉取?