亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

限制 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 關注
  • 231 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號