2011-09-13 66 views
0

我想通過Http輸出流從Java客戶端發送一些非常大的文件(> 200MB)到運行在Tomcat中的servlet。需要通過http輸出流發送多個對象

我的當前協議封裝該文件的內容在一個byte[]和被放置AA Map<String, Object>一些元數據(文件名等),下一個「標準」的鍵中的每個部分("FILENAME"沿 - >"Foo""CONTENTS" - >byte[]"USERID"1234等)。 Map被寫入URL連接輸出流(urlConnection.getOutputStream())。當文件內容很小時(< 25MB),這可以很好地工作,但是當文件大小非常大時,我遇到了Tomcat內存問題(OutOfMemoryError)。

我想先發送元數據Map,然後是文件內容,最後是文件數據的校驗和。接收方servlet可以從其輸入流中讀取元數據,然後讀取字節,直到整個文件完成,最後讀取校驗和。

在連接頭中發送元數據會更好嗎?如果是這樣,怎麼樣?如果我先將元數據先發送到套接字,然後再發送文件內容,那麼是否有某種標準協議可以做到這一點?

回答

2

您幾乎可以肯定希望使用multipart POST將數據發送到服務器。然後在服務器上,您可以使用類似commons-fileupload的東西來處理上傳。

commons-fileupload的好處在於它理解服務器可能沒有足夠的內存來緩衝大文件,並且一旦超過一定大小就會自動將上傳的數據流式傳輸到磁盤,這對避免OutOfMemoryError類型問題。

否則,你將不得不實施自己可比的事情。只要服務器能夠解析上傳文件並將數據重定向到一個文件,以便它永遠不需要將整個請求緩衝在內存中,它對於打包和發送數據的方式並沒有太大的差別立刻。如前所述,如果你使用commons-fileupload,這兩個都是免費的,所以這絕對是我推薦的。

+0

我認爲這正是我所需要的。我會調查。謝謝。 – Ralph

0

我沒有直接的答案,但你可以考慮使用FTP來代替。 Apache Mina提供了FTPLets,本質上是響應FTP事件的servlet(有關詳細信息,請參閱http://mina.apache.org/ftpserver/ftplet.html)。

這將允許您以任何格式推送您的數據,而不需要接收端將整個數據存儲在內存中。

問候。