限制FormFile中的文件大小

时间:2015-01-21 17:33:15

标签: go

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

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

已创建文件对象。那么我已经承担了整个文件的阅读费用吗?

4 个答案:

答案 0 :(得分:6)

使用MaxBytesReader限制请求的大小。在调用ParseMultiPartForm或FormFile之前,请执行以下行:

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

其中r*http.Requestwhttp.Response

这限制了整个请求正文的大小,而不是单个文件。如果您一次上传一个文件,限制请求正文的大小应该是一个很好的近似限制文件大小。

如果要限制使用的内存量而不是请求正文大小,请在调用r.FormFile()之前调用r.ParseMultipartForm(maxMemory)。对于文件部分,这将使用最多maxMemory个字节,其余部分存储在磁盘上的临时文件中。

答案 1 :(得分:6)

有些人建议依赖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
}

如果您的请求正文大于2 Mb,您会看到如下内容:multipart: NextPart: http: request body too large

答案 2 :(得分:3)

调用FormFile调用ParseMultiPartForm,它将解析整个请求正文,默认情况下最多使用32M,然后将内容存储在临时文件中。您可以在调用ParseMultiPartForm之前自己调用FormFile以确定要消耗多少内存,但仍然会解析正文。

客户端可能会在您可以使用的multipart.FileHeader中提供Content-Length标头,但这取决于客户端。

如果要限制传入的请求大小,请在解析任何Body之前将request.BodyMaxBytesReader包装在处理程序中。

答案 3 :(得分:1)

您在请求结构和r.ContentLength int64方法中有r.Header.Get("Content-Length") string个字段。也许这可以帮助。