2011-05-29 326 views
1

通常,我需要通過調用servlet的html表單上傳大文件,然後用繁重的算法處理該文件,並返回一個xml文檔作爲響應。 這整個過程需要很長時間,所以爲了避免瀏覽器超時連接,我決定創建一個對象(擴展Thread),這個對象將執行耗時的過程(上載文件並操作它)在不同的線程中這將能夠表明過程的進展。爲此,我需要將HttpServletRequest請求作爲參數傳遞給對象。 當我試圖解析請求參數(我使用Apache的百科全書文件上傳),我得到了以下異常:將HttpServletRequest對象作爲參數傳遞

"the request doesn't contain a multipart/form-data or multipart/mixed stream, content type header is null" . 

是否有可能一個HttpServletRequest對象傳遞給一個對象擴展Thread?如果是這樣,安全地做到這一點的正確做法是什麼?

+0

您的html表單是否包含值爲'multipart/form-data'的enctype屬性? – asgs 2011-05-29 17:30:25

+0

是的。我可以在doPost方法中輕鬆完成,問題是當我將請求作爲參數傳遞時。 – ElChe 2011-05-29 17:37:55

回答

3

你不應該。當請求對象在線程中使用時,請求可能不再有效,並且Tomcat可能已經清除了它(因此,您的例外)(當然,假設您的表單確實是enctype="multipart/form-data"

所以,爲了處理這適當地從請求中提取數據並將其傳遞給新線程。因此,您不會依賴於請求對象 - 僅限於其內容。

請注意,Servlet 3.0爲異步服務器端處理添加了一個選項,這對您來說似乎是一個不錯的選擇 - check it out

+0

感謝您指出異步服務器端處理,我會研究它。我想阻止瀏覽器等待,直到我完成從請求中提取文件(就像我現在在doPost方法中那樣),所以我想在不同的線程中完成它。那麼將請求作爲參數傳遞是不可能的? – ElChe 2011-05-29 17:48:38

+0

只需從中獲取數據不應該很昂貴,所以獲取數據並將其傳遞給線程。 – Bozho 2011-05-29 18:03:23

+0

您能否再解釋一下「請求可能不再有效」?當時,這個答案已經有幾年了,可能沒人會看到這個評論。 – Rebeccah 2016-08-02 21:39:40

0

您收到的錯誤表明客戶端的表單可能沒有正確設置。請確保您的表單是這樣定義的:

<FORM action="YOUR_SERVLET" 
    enctype="multipart/form-data" 
    method="post"> 
+0

它的確如此。我在doPost方法中很容易做到這一點,問題是當我將請求作爲參數傳遞時。 – ElChe 2011-05-29 17:50:13

相關問題