我让用户使用FormFile上传文件.我应该在什么时候检查文件大小是否太大.当我做
file, header, fileErr := r.FormFile("file")
Run Code Online (Sandbox Code Playgroud)
已创建文件对象.那么我已经承担了整个文件的阅读费用吗?
使用MaxBytesReader限制请求的大小。在调用ParseMultiPartForm或FormFile之前,执行以下行:
r.Body = http.MaxBytesReader(w, r.Body, max)
Run Code Online (Sandbox Code Playgroud)
这里r是*http.Request和w是http.Response。
这限制了整个请求主体而不是单个文件的大小。如果您一次上传一个文件,则限制请求正文的大小应近似限制文件大小。
如果要限制使用的内存量而不是请求主体大小,请在调用之前调用r.ParseMultipartForm(maxMemory)r.FormFile()。这将占用最多maxMemory字节的文件部分,其余部分存储在磁盘上的临时文件中。
调用FormFilecalls ParseMultiPartForm,它将解析整个请求体,默认情况下最多使用32M,然后将内容存储在临时文件中。你可以ParseMultiPartForm在调用之前调用自己来FormFile确定要消耗多少内存,但主体仍然会被解析。
客户端可能会提供您可以使用的Content-Length标头multipart.FileHeader,但这取决于客户端。
如果要限制传入请求的大小,请在解析任何正文之前将request.Bodywith包装在处理程序中。MaxBytesReader
有些人建议依靠Content-Length标题,我必须警告你根本不要使用标题.此标头可以是任何数字,因为无论实际文件大小如何,客户端都可以更改它.
使用MaxBytesReader,因为:
MaxBytesReader可防止客户端意外或恶意发送大量请求并浪费服务器资源.
这是一个例子:
r.Body = http.MaxBytesReader(w, r.Body, 2 * 1024 * 1024) // 2 Mb
clientFile, handler, err := r.FormFile(formDataKey)
if err != nil {
log.Println(err)
return
}
Run Code Online (Sandbox Code Playgroud)
如果您的请求正文大于2 Mb,您将看到如下内容: multipart: NextPart: http: request body too large
您r.ContentLength int64在请求结构和r.Header.Get("Content-Length") string方法中有字段。也许这会有所帮助。