天天看點

Webwork 學習之路【07】檔案上傳下載下傳

  Web上傳和下載下傳應該是很普遍的一個需求,無論是小型網站還是大并發通路的交易網站。WebWork 當然也提供了很友好的攔截器來實作對檔案的上傳,讓我們可以專注與業務邏輯的設計和實作,在實作上傳和下載下傳時順便關注了下架構上傳下載下傳的實作,在本篇博文中總結記錄如下。 

Webwork 學習之路【07】檔案上傳下載下傳

每次用戶端請求 Action 時,都會調用 WebWork 排程類 ServletDispatcher.service()方法。

Webwork 學習之路【07】檔案上傳下載下傳
Webwork 學習之路【07】檔案上傳下載下傳

      先來看看 wrapRequest 方法做了什麼:

Webwork 學習之路【07】檔案上傳下載下傳
Webwork 學習之路【07】檔案上傳下載下傳

 首先判斷了傳進來的 request 是不是已經被封裝好的 MultiPartRequestWrapper,如果是就直接傳回。

 否則再判斷 request 的頭資訊裡面的 Content­Type 是不是多類型參數 (multipart/form­data)的請求,如果是就把 request 包裝成 WebWork 自己的 MultiPartRequestWrapper 類型,該類型繼承HttpServletRequestWrapper 。

    MultiPartRequest.isMultiPart() 方法實作如下:

在 webwork.properties 裡面配置檔案的臨時存儲目錄、還有最大上傳大小,其實就是在這個時候起到作用的。

建立 MultiPartRequestWrapper 對象的時候傳入的參數是由 getSaveDir() 和 getMaxSize() 方 法 獲 得 的 。

在方法裡會查找配置裡面的 webwork.multipart.saveDir、 webwork.multipart.maxSize 屬性,找到則使用該屬性指定的臨時目錄和上傳的最大内容,沒找到就使用環境的臨時目錄。

具體實作如下:

Webwork 學習之路【07】檔案上傳下載下傳
Webwork 學習之路【07】檔案上傳下載下傳

   再來看一下 MultiPartRequestWrapper 的構造函數使如何包裝 request 的:

Webwork 學習之路【07】檔案上傳下載下傳
Webwork 學習之路【07】檔案上傳下載下傳

 首先它判斷了傳入的 request 是不是 MultiPartRequest 抽象類的子類,如果是就直接把自身的 MultiPartRequest 類型的變量引用 request。

 否則讀取 WebWork 配置 的webwork.multipart.parser 屬性,該屬性決定 Webwork 内部用什麼實作檔案上傳。 如果沒有指定,則預設使用 PellMultiPartRequest 的實作。

找到配置的類後,WebWork 通過 Java 反射建立該類的執行個體。所有支援的類都是從 MultiPartRequest 繼承而來,建立該執行個體後向上轉型,并賦予 MultiPartRequestWrapper 的成員multi。 

 WebWork 的檔案上傳封裝了幾種通用的 FileUpload lib,并不是自己實作的。

它包括了pell,cos,apache common 三種實作,WebWork 對這三個包進行封裝,提供了一 個通用的通路接口 MultiPartRequest,細節實作分别是 PellMultiPartRequest、 CosMultiPartRequest 、JakartaMultiPartRequest 。

 jakarta 支援多個檔案使用同一個HTTP參數名。如果直接使用 WebWork 的 FileUpload 攔截器,推薦使用pell,因為當你上傳中文檔案名稱的檔案的時候,隻有pell 包會正确的獲得中文檔案名稱,apache common會将檔案名稱改為xxx.tmp這樣的檔案名,而cos會亂碼, 是以我們唯一的選擇隻有 pell。

cos 的功能比較強大,WebWork 的封裝卻使它喪失了很多的功能,cos 需要設定 request 的character encoding。WebWork的封裝沒有設定,是以就導緻了cos的亂碼問題,當然如果你單獨 使用cos,則會避免此類問題。

 配置檔案

Webwork 學習之路【07】檔案上傳下載下傳
Webwork 學習之路【07】檔案上傳下載下傳

通過對 Webwork 上傳請求的封裝和解析類的擷取,所有的前戲都已經準備妥當,上傳攔截器裡面具體實作如下:

Webwork 學習之路【07】檔案上傳下載下傳
Webwork 學習之路【07】檔案上傳下載下傳

首先判斷目前請求是否為 包含多媒體請求,如果是則記錄日志,并執行 Action。

然後判斷在檔案上傳過程 MultiPartRequestWrapper 是否含有錯誤,将錯誤資訊,傳回給用戶端,不在繼續調用 Action。

如果上面的判斷條件都沒有進行,開始周遊 MultiPartRequestWrapper  中的上傳檔案的參數,并将其中的檔案名、檔案内容類型放入Action 參數 map 中,供後面的業務類進行操作。

在 WebWork 的 fileupload 攔截器功能中,它提供的 File隻 是一個臨時檔案,Action 執行之後就會被自動删除,你必須在 Action中自己處理檔案的存儲問題,或者寫到伺服器的某個目錄,或者儲存到資料庫中。如果你準備寫到伺服器的某個目錄下面的話,你必須自己面臨着處理檔案同名的問題,但是實際上cos包已經提供了 檔案重名的自動重命名規則。 

 本文轉自Orson部落格園部落格,原文連結:http://www.cnblogs.com/java-class/p/5175619.html,如需轉載請自行聯系原作者

繼續閱讀