2014-02-21 70 views
0

我需要將一些通用java客戶端的二進制文件轉移到使用servlet技術的服務器。
問題來了,因爲我需要檢查一些數據發送給我的文件,以授權上傳。此外,我還需要有關該文件的其他信息才能表徵它(名稱,作者...)。如何使用java servlets進行受限文件傳輸

我雖然是:

  • (A)使用接收通過默認的InputStream的請求GenericServlet類。它會讀取預格式化的數據結構,然後如果數據正常,它將讀取並保存文件

  • (B)使用HttpServlet並進行通常的http文件上傳(這將需要客戶端支持http環境)並使用一些帖子屬性來獲取附加數據。

現在的問題: 選項A:

  • 是有一種方式來獲得,以第一赤他們,然後讓只有當數據是確定文件傳輸文件之前的初始數據以這種方式來限制數據不正常的情況下的內存使用情況?

  • 如果文件很長併到達服務器,比如我們說N部分,並且在客戶端完成發送所有N部分之前,servlet檢查其他信息發現它們不好,是否有辦法通過在轉移過程中通過回答客戶來打破轉移以打破「不良」和沉重要求?

  • 我可以在同一請求中將多個Java對象(如本例中的自定義FileInfo類)與二進制文件一起傳輸嗎?

選項B:

  • 它是一個很好的初步實踐,始終使用http?

  • 一旦設置了multipart數據類型,文件內容是作爲post變量的內容發送的?

感謝

+0

您可以在開始上傳之前在Javascript中檢查客戶端的文件大小https://developer.mozilla.org/en-US/docs/Web/Guide/HTML/HTML5/Constraint_validation其餘的,我會很驚訝如果可能的話。 – developerwjk

+0

客戶通常不認爲是html/js。無論如何,我更喜歡驗證數據服務器端,因爲它更安全,我需要檢查和存儲更多數據 – LJSilver

回答

1

這兩個選項是好的,但B是在工作中比A.更靈活我只是執行B選項替換/隱藏遺留協議。在我看來,使用HTTP是很好的做法:它不會很快消失,幾乎所有的編程語言都能很好地支持它。 Plus管理員有許多工具可用於授權請求,直接流量和監控負載。

我選擇以下設置:

客戶端不使用兩部分後Apache的HttpClient和HttpMime(見多部分職位例如here)。第一部分是包含所有必需元數據的JSON(UTF-8)字符串。此JSON字符串通過Map <字符串編碼/解碼,對象>,使用Jackson的示例爲here。第二部分是文件上傳(FileBody-part)。

服務器是一個Tomcat Servlet,它使用Commons FileUpload接收這兩個部分。第一個JSON部分預計會首先驗證。如果不正常,servlet立即發送一個「NOK」響應(例如「錯誤請求」)。然後文件被接收並處理。

我選擇了元數據的JSON,因爲這是一種易於理解(可讀性像XML)並且在web-world中具有良好支持的格式。另一種方法是使用http-headers作爲參數並將文件作爲主體發送(可能更容易實現)。

我選擇了Apache的HttpMime和Common的FileUpload,因爲它們在一起工作得很好。不難理解這些應該如何一起工作(研究示例),我還沒有遇到一個很難解決的問題。另外,Apache的HttpClient 4.3終於支持默認的函數(例如(de)壓縮請求),我之前不得不跳入循環。

但是對我來說第一:文件數據的處理已完成流式傳輸。我已經通過在由Apache HttpClient動態壓縮的多部分發布請求中上傳2GB文件來證實了這一點。客戶端和服務器都不要求任何額外的內存來處理這個大文件(但是它需要一些時間來傳輸所有的字節)。

由於HTTP的性質,我擔心客戶端一旦啓動就不能停止發送文件數據。但這不應該成爲一個問題,因爲這將是一個特殊的情況,而不是常態。

+0

非常感謝您的建議,我將檢查httpmime和fileupload解決方案! – LJSilver

+0

另一個問題,你如何解決2部分的請求?兩個請求或一個請求分爲兩部分? – LJSilver

+0

@mb_後者(請參閱多部分後期示例)。由於網絡延遲,第一個(兩個請求)會慢很多。此外,由於HTTP本質上是無狀態的,因此服務器如何跟蹤兩個相關的獨立客戶端請求? – vanOekel