2011-09-14 128 views
10

爲了處理HTTP POST或PUT中的大型請求體,依靠HttpServletRequest.getContentLength()不是一個好主意,因爲它只返回整數值或-1對於請求體> 2GB。javax.servlet.HttpServletRequest.getContentLength()僅返回int

但是,我沒有看到任何理由,爲什麼不應允許更大的請求體。 RFC 2616說

任何內容長度大於或等於零是一個有效的值。

是否有效使用HttpServletRequest.getHeader('content-length')並將其解析爲Long?

+2

不知道是否申請上傳,但你也可能想看分塊編碼。 – McDowell

+0

Java Servlet於1997年推出; 2GB在當時是相當不可想象的。那時還有1GB消費級硬盤? RFC 2616的日期是1999年。 – irreputable

回答

8

是的,這是一個很好的方法 - 使用getHeader("Content-Length")(大寫)和Long.parseLong(..)。我相信這是容器正在做的事情,但它只限於serlvet規範的int

+1

事實上,從另一方面來說,執行'response.setHeader(「Content-Length」,String.valueOf(someLong));'也是完全有效的。你只需要對某些磁盤文件系統的4GB限制以及服務器的2GB POST大小配置小心一點。 – BalusC

+0

@McDowell關於「chuncked」有一個好處。 (我認爲無論如何處理> 2G文件都是奇怪的..) – Bozho

+0

@BalusC,你能解釋一下你的意思嗎?*服務器的2GB POST大小配置*?謝謝。 – Hank

7

由於Servlet的3.1(Java EE 7),一個新的方法是可用的,getContentLengthLong()

long contentLength = request.getContentLengthLong(); 

這同樣適用於與其對應的響應,setContentLengthLong()

response.setContentLengthLong(file.length());