1. 程式人生 > 實用技巧 >實現檔案下載的Action

實現檔案下載的Action

可能很多讀者會覺得,檔案下載太簡單,直接在頁面上給出一個超級連結,該連結的href屬性等於要下載檔案的檔名,不就可以實現檔案下載了嗎?大部分時候的確可以實現檔案下載,但如果該檔案的檔名為中文檔名,則會導致下載失敗;如果應用程式需要在使用者下載之前進行進一步檢查,比如判斷使用者是否有足夠許可權來下載該檔案等,那麼就需要讓Struts 2來控制下載了。

看下面的一個原始的下載頁面程式碼片段。

程式清單:codes\04\4.4\down\rawDown.html

  1. <h1>原始的下載</h1>
  2. <ul>
  3. <li>
  4. 下載瘋狂Java聯盟的Logo:
  5. <ahref=
    "p_w_picpaths/瘋狂聯盟.jpg">下載圖形檔案</a>
  6. </li>
  7. <li>
  8. 下載瘋狂Java聯盟的Logo的壓縮檔案:
  9. <ahref="p_w_picpaths/wjc_logo.zip">下載壓縮檔案</a>
  10. </li>
  11. </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

  1. publicclassFileDownloadAction
  2. extendsActionSupport
  3. {
  4. //該屬性可以在配置檔案中動態指定該屬性值
  5. privateStringinputPath;
  6. //依賴注入該屬性值的setter方法
  7. publicvoidsetInputPath(Stringvalue)
  8. {
  9. inputPath=value;
  10. }
  11. /*
  12. 定義一個返回InputStream的方法,
  13. 該方法將作為被下載檔案的入口,
  14. 且需要配置stream型別結果時指定inputName引數,
  15. inputName引數的值就是方法去掉get字首、首字母小寫的字串
  16. */
  17. publicInputStreamgetTargetFile()throwsException
  18. {
  19. //ServletContext提供getResourceAsStream()方法
  20. //返回指定檔案對應的輸入流
  21. returnServletActionContext.getServletContext()
  22. .getResourceAsStream(inputPath);
  23. }
  24. }

從上面的Action中看到,該Action中包含了一個getTargetFile()方法,該方法返回一個InputStream輸入流,這個輸入流返回的是下載目標檔案的入口。該方法的方法名為getTargetFile,則stream型別的結果對映中inputName引數值為targetFile

一旦我們定義了該Action,就可通過該Action來實現檔案下載。

轉載於:https://blog.51cto.com/javaligang/891319