WebWork文件上傳實現淺析
Webwork文件上傳看了很多的文章收獲不少,目前比較簡單的方式是通過webwork提供的FileUploadInterceptor來實現Webwork文件上傳,這個攔截器在使用的時候是非常方便的,通過這個攔截器可以自動獲得上傳文件的文件名、文件類型、文件三個部分。然后用戶可以再進行后續的處理,包括將文件信息存入數據庫、移動文件到制定的文件夾等。
對于這個攔截器的工作原理大致是這樣的,用戶執行Action的時候,攔截器構造request:
java 代碼
- HttpServletRequest request = (HttpServletRequest)
- ac.get(ServletActionContext.HTTP_REQUEST);
然后判斷request是否是MultiPartRequestWrapper的一個實例,接下來初始化MultiPartRequestWrapper:
java 代碼
- MultiPartRequestWrapper multiWrapper =
- (MultiPartRequestWrapper) request;
這里就通過判斷用戶在webwork.properties中定義Webwork文件上傳類型來構造MultiPartRequestWrapper,
java 代碼
- String parser = Configuration.getString
- (WebWorkConstants.WEBWORK_MULTIPART_PARSER);
- // If it's not set, use Jakarta
- if (parser.equals("")) {
- log.warn("Property webwork.multipart.parser not set." +
- " Using com.opensymphony.webwork.dispatcher.
- multipart.JakartaMultiPartRequest");
- parser = "com.opensymphony.webwork.dispatcher.
- multipart.JakartaMultiPartRequest";
- }
- // legacy support for old style property values
- else if (parser.equals("pell")) {
- parser = "com.opensymphony.webwork.dispatcher.
- multipart.PellMultiPartRequest";
- } else if (parser.equals("cos")) {
- parser = "com.opensymphony.webwork.dispatcher.
- multipart.CosMultiPartRequest";
- } else if (parser.equals("jakarta")) {
- parser = "com.opensymphony.webwork.dispatcher.
- multipart.JakartaMultiPartRequest";
- }
假設用戶定義了jakarta,這時候就通過JakartaMultiPartRequestMonitor來實現Webwork文件上傳(通過common-fileupload),同時獲得文件的名稱和類型等信息。
對于文件上傳進度條,網上提供了一種給予servlet的解決辦法,這種方式可以很方便的使用在Struts模式下的mvc架構的程序中,其中用到的類包可以在http://www.telio.be/blog/wp-content/uploads/2006/01/上找到,這種方式的實質是用到了dwr的回調方式。servlet的上傳方式是通過下面的方式實現的:
java 代碼
- ServletFileUpload upload =
- new ServletFileUpload(factory);
- upload.parseRequest(servletRequest);
而進度條是通過實現一個factory,來實現上傳狀態的回調。
webwork的攔截器實際已經將上傳文件到臨時目錄封裝在內部的類中,這樣我們就無法構造factory來實現進度條的監控,給予以上的考慮,想了一個比較笨的辦法,將MultiPartRequestWrapper修改一下,增加一個新的屬性定義:
java 代碼
- else if (parser.equals("monitor"))
- {
- parser = "com.opensymphony.webwork.
- dispatcher.multipart.JakartaMultiPartRequestMonitor";
- }
這樣用戶可以在webwork.properties中設置上傳的模式為monitor,然后自己實現一個JakartaMultiPartRequestMonitor,在這個class中,將原有的factory實現方法通過帶進度條的方式來實現,這樣就能監控到servlet上傳的進度。基本的實現思路就是這樣的。下面將幾個配置過程整理一下:
1、將修改的兩個類添加到webwork2.2.x。jar中:MultiPartRequestWrapper。class和JakartaMultiPartRequestMonitor.class
2、修改webwork.webwork.properties:webwork.multipart.parser=monitor
3、將剛才下載的be.telio.mediastore.ui.upload的代碼加入
4、修改dwr.xml文件,添加下面的代碼:
xml 代碼
- <create creator="new" javascript="UploadMonitor">
- name="class" value="
- be.telio.mediastore.ui.upload.UploadMonitor"/>
- create>
- <convert converter="bean" match="
- be.telio.mediastore.ui.upload.UploadInfo"/>
5、將下載的包中的resource文件夾拷貝到web目錄下
6、建立一個文件上傳action
7、建立Webwork文件上傳頁面,添加幾個js,同時在form中添加startProgress():
- <script src='/ugc/resources/js/upload.js'> </script>
- <script src='/ugc/dwr/interface/UploadMonitor.js'>
- </script>
- <script src='/ugc/dwr/engine.js'>
- </script>
- <script src='/ugc/dwr/util.js'>
- </script>
- <ww:form action="doUpload" method="POST" enctype="
- multipart/form-data" onsubmit="startProgress()">
這樣WebWork文件上傳進度條就可以實現了
【編輯推薦】