为了账号安全,请及时绑定邮箱和手机立即绑定

限制 FormFile 中的文件大小

限制 FormFile 中的文件大小

Go
慕妹3146593 2021-09-13 10:10:38
我让用户使用 FormFile 上传文件。我应该在什么时候检查文件大小是否太大。当我做 file, header, fileErr := r.FormFile("file")文件对象已经创建。那么我是否已经承担了读取整个文件的成本?https://golang.org/pkg/net/http#Request.FormFile
查看完整描述

3 回答

?
翻阅古今

TA贡献1780条经验 获得超5个赞

使用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字节的文件部分,其余部分存储在磁盘上的临时文件中。此调用不限制从客户端读取的总字节数或上传文件的大小。

检查请求 Content-Length标头不起作用有两个原因:

  • 未为分块请求正文设置内容长度。

  • 服务器可以读取整个请求正文以支持连接保持活动。违反 MaxBytesReader 限制是确保服务器停止读取请求正文的唯一方法。


查看完整回答
反对 回复 2021-09-13
?
泛舟湖上清波郎朗

TA贡献1818条经验 获得超3个赞

有些人建议依赖Content-Lengthheader,我不得不警告你根本不要使用它。此标头可以是任意数字,因为无论实际文件大小如何,客户端都可以更改它。


使用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


查看完整回答
反对 回复 2021-09-13
?
GCT1015

TA贡献1827条经验 获得超4个赞

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

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

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



查看完整回答
反对 回复 2021-09-13
  • 3 回答
  • 0 关注
  • 186 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信