我让用户使用 FormFile 上传文件。我应该在什么时候检查文件大小是否太大。当我做的时候
file, header, fileErr := r.FormFile("file")
一个文件对象已经创建。那么我是否已经产生了阅读整个文件的成本?
最佳答案
使用http.MaxBytesReader限制从请求中读取的字节数。在调用 ParseMultiPartForm 或 FormFile 之前,执行这一行:
r.Body = http.MaxBytesReader(w, r.Body, max)
其中 r
是 *http.Request
,w
是 http.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/