我正在Tomcat 6.0.26中運行一個servlet。該servlet通過HTTP POST接受來自客戶端的文件上傳。我想停止從HttpServlet端上傳文件。我試過,沒有運氣以下方法:如何關閉來自HttpServlet的HTTP連接
- 關閉請求的InputStream
- 發送錯誤代碼HttpServletResponse.SC_REQUEST_ENTITY_TOO_LARGE和沖洗響應
- 做1和2在濾鏡
我GOOGLE了,但沒有找到直接的答案。請提供解決方案。
謝謝。
我正在Tomcat 6.0.26中運行一個servlet。該servlet通過HTTP POST接受來自客戶端的文件上傳。我想停止從HttpServlet端上傳文件。我試過,沒有運氣以下方法:如何關閉來自HttpServlet的HTTP連接
我GOOGLE了,但沒有找到直接的答案。請提供解決方案。
謝謝。
這是不可能使用標準Servlet或Commons FileUpload API的。基本上,爲了能夠立即中止連接,您應該物理地抓住底層套接字並關閉它。但是,這個套接字是由網絡服務器控制的。另請參閱以下相關問題:How to explicitly terminate http connection from server with no response header。
但是,小測試證實,當Commons FileUpload的大小超過限制時,Commons FileUpload不會在內存中緩衝整個文件。它將讀取輸入流,但忽略並丟棄讀取字節(也是已讀取的字節)。所以記憶效率在這裏不一定是問題。
要解決真正的問題,您基本上想驗證客戶端而不是服務器端的文件大小。這可以通過Java Applet或Flash應用程序來實現。例如,分別爲JumpLoader和SWFUpload。
問題是多或更少的Aborting upload from a servlet to limit file size
重複你嘗試使用Apache的百科全書?
服務器對象中有一個setFileSizeMax方法,表示從請求中上傳文件。
這裏有一些瘋狂的解決方法:你可以寫一些防火牆獨立應用程序,基於處理HTTP請求的套接字,解析標頭,如果請求匹配你的一些自定義條件 - 防火牆轉發給Tomcat,否則返回HTTP錯誤響應。或者你可以嘗試用Apache規則調整Apache < - > Tomcat。
這是不可能使用標準的API。如果你這樣做,你違反了一些協議標準/ RFC。那麼,你爲什麼要這樣做?
取而代之,發送一個沒有http正文的「Connection:close」響應(http頭)。
我試過FileUpload,但它不適合我。我想要的是完全停止上傳過程。但是使用FileUpload的setFileSizeMax,它不會停止客戶端將整個內容上傳到服務器(這花費了服務器的帶寬)。 – Jason 2010-06-25 00:52:53
@Jason:您需要使用[流模式](http://commons.apache.org/fileupload/streaming.html)。它默認首先將文件讀入內存/ tempdisk。 – BalusC 2010-06-27 01:23:45
@BalusC:我想要的是終止客戶端的上傳過程。在做任何事情之前,流模式仍然會接收整個文件。這太遲了。 – Jason 2010-06-30 04:51:24