3 回答

TA貢獻1780條經驗 獲得超5個贊
使用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
字節的文件部分,其余部分存儲在磁盤上的臨時文件中。此調用不限制從客戶端讀取的總字節數或上傳文件的大小。
檢查請求 Content-Length標頭不起作用有兩個原因:
未為分塊請求正文設置內容長度。
服務器可以讀取整個請求正文以支持連接保持活動。違反 MaxBytesReader 限制是確保服務器停止讀取請求正文的唯一方法。

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

TA貢獻1827條經驗 獲得超4個贊
調用FormFile
calls?ParseMultiPartForm
,它將解析整個請求正文,默認情況下最多使用 32M,然后將內容存儲到臨時文件中。您可以ParseMultiPartForm
在調用之前調用自己FormFile
以確定要消耗多少內存,但仍然會解析主體。
客戶端可能會提供您可以使用的Content-Length
標頭multipart.FileHeader
,但這取決于客戶端。
如果您想限制傳入的請求大小,請在解析任何 Body 之前將request.Body
with包裝MaxBytesReader
在您的處理程序中。
- 3 回答
- 0 關注
- 231 瀏覽
添加回答
舉報