3 回答

TA貢獻(xiàn)1780條經(jīng)驗(yàn) 獲得超5個(gè)贊
使用http.MaxBytesReader限制從請(qǐng)求中讀取的字節(jié)數(shù)。在調(diào)用 ParseMultiPartForm 或 FormFile 之前,執(zhí)行以下行:
r.Body = http.MaxBytesReader(w, r.Body, max)
這里r
是*http.Request
和w
是http.Response
。
MaxBytesReader 限制為整個(gè)請(qǐng)求正文而不是單個(gè)文件讀取的字節(jié)數(shù)。當(dāng)只有一個(gè)文件上傳時(shí),請(qǐng)求正文大小的限制可以很好地近似于文件大小的限制。如果您需要對(duì)一個(gè)或多個(gè)文件實(shí)施特定限制,請(qǐng)為所有預(yù)期請(qǐng)求數(shù)據(jù)設(shè)置足夠大的 MaxBytesReader 限制,并檢查每個(gè)文件的FileHeader.Size。
當(dāng)超出 http.MaxBytesReader 限制時(shí),服務(wù)器將停止從請(qǐng)求中讀取數(shù)據(jù)并在處理程序返回后關(guān)閉連接。
如果要限制使用的內(nèi)存量而不是請(qǐng)求正文大小,請(qǐng)?jiān)谡{(diào)用r.ParseMultipartForm(maxMemory)之前調(diào)用r.FormFile()
。這將使用最多maxMemory
字節(jié)的文件部分,其余部分存儲(chǔ)在磁盤上的臨時(shí)文件中。此調(diào)用不限制從客戶端讀取的總字節(jié)數(shù)或上傳文件的大小。
檢查請(qǐng)求 Content-Length標(biāo)頭不起作用有兩個(gè)原因:
未為分塊請(qǐng)求正文設(shè)置內(nèi)容長度。
服務(wù)器可以讀取整個(gè)請(qǐng)求正文以支持連接保持活動(dòng)。違反 MaxBytesReader 限制是確保服務(wù)器停止讀取請(qǐng)求正文的唯一方法。

TA貢獻(xiàn)1818條經(jīng)驗(yàn) 獲得超3個(gè)贊
有些人建議依賴Content-Lengthheader,我不得不警告你根本不要使用它。此標(biāo)頭可以是任意數(shù)字,因?yàn)闊o論實(shí)際文件大小如何,客戶端都可以更改它。
使用MaxBytesReader因?yàn)椋?/p>
MaxBytesReader 防止客戶端意外或惡意發(fā)送大請(qǐng)求并浪費(fèi)服務(wù)器資源。
下面是一個(gè)例子:
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
}
如果您的請(qǐng)求正文大于 2 Mb,您將看到如下內(nèi)容: multipart: NextPart: http: request body too large

TA貢獻(xiàn)1827條經(jīng)驗(yàn) 獲得超4個(gè)贊
調(diào)用FormFile
calls?ParseMultiPartForm
,它將解析整個(gè)請(qǐng)求正文,默認(rèn)情況下最多使用 32M,然后將內(nèi)容存儲(chǔ)到臨時(shí)文件中。您可以ParseMultiPartForm
在調(diào)用之前調(diào)用自己FormFile
以確定要消耗多少內(nèi)存,但仍然會(huì)解析主體。
客戶端可能會(huì)提供您可以使用的Content-Length
標(biāo)頭multipart.FileHeader
,但這取決于客戶端。
如果您想限制傳入的請(qǐng)求大小,請(qǐng)?jiān)诮馕鋈魏?Body 之前將request.Body
with包裝MaxBytesReader
在您的處理程序中。
- 3 回答
- 0 關(guān)注
- 230 瀏覽
添加回答
舉報(bào)