實現檔案下載的Action
可能很多讀者會覺得,檔案下載太簡單,直接在頁面上給出一個超級連結,該連結的href屬性等於要下載檔案的檔名,不就可以實現檔案下載了嗎?大部分時候的確可以實現檔案下載,但如果該檔案的檔名為中文檔名,則會導致下載失敗;如果應用程式需要在使用者下載之前進行進一步檢查,比如判斷使用者是否有足夠許可權來下載該檔案等,那麼就需要讓Struts 2來控制下載了。
看下面的一個原始的下載頁面程式碼片段。
程式清單:codes\04\4.4\down\rawDown.html
- <h1>原始的下載</h1>
- <ul>
- <li>
- 下載瘋狂Java聯盟的Logo:
- <ahref=
- </li>
- <li>
- 下載瘋狂Java聯盟的Logo的壓縮檔案:
- <ahref="p_w_picpaths/wjc_logo.zip">下載壓縮檔案</a>
- </li>
- </ul>
上面的頁面包含兩個下載的超級連結,兩個連結的資源都是存在的,但因為第一個資原始檔的檔名是中文檔名,如果單擊第一個超級連結,將出現如圖4.27所示的頁面。
從圖4.27所示頁面中橢圓形框包圍的地方,我們看到被下載的檔名變成了包含大量
為了解決這個問題,我們使用Struts 2的檔案下載支援來下載該檔案。
Struts 2的檔案下載Action與普通的Action並沒有太大的不同,僅僅是該Action需要提供一個返回InputStream流的方法,該輸入流代表了被下載檔案的入口。該Action類的程式碼如下。
程式清單:codes\04\4.4\down\WEB-INF\src\org\crazyit\app\action\FileDownloadAction.java
- publicclassFileDownloadAction
- extendsActionSupport
- {
- //該屬性可以在配置檔案中動態指定該屬性值
- privateStringinputPath;
- //依賴注入該屬性值的setter方法
- publicvoidsetInputPath(Stringvalue)
- {
- inputPath=value;
- }
- /*
- 定義一個返回InputStream的方法,
- 該方法將作為被下載檔案的入口,
- 且需要配置stream型別結果時指定inputName引數,
- inputName引數的值就是方法去掉get字首、首字母小寫的字串
- */
- publicInputStreamgetTargetFile()throwsException
- {
- //ServletContext提供getResourceAsStream()方法
- //返回指定檔案對應的輸入流
- returnServletActionContext.getServletContext()
- .getResourceAsStream(inputPath);
- }
- }
從上面的Action中看到,該Action中包含了一個getTargetFile()方法,該方法返回一個InputStream輸入流,這個輸入流返回的是下載目標檔案的入口。該方法的方法名為getTargetFile,則stream型別的結果對映中inputName引數值為targetFile。
一旦我們定義了該Action,就可通過該Action來實現檔案下載。
轉載於:https://blog.51cto.com/javaligang/891319