您好,登錄后才能下訂單哦!
這篇“Struts2文件如何下載”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Struts2文件如何下載”文章吧。
文件下載路徑問題,項目運行時MyEclipse會加載Tomcat的webapps目錄下的項目。所以,關于路徑問題(一定要設置相對路徑強度)
下載到本地服務器需要相對路徑。最好使用絕對路徑上傳到客戶端
上傳文件需要很多包。
Struts 2 支持通過 org.apache.slruts2.dispatcher.Stream ResuIt 的結果類型下載文件。
它使下載易于編寫的程序變得更加容易。
StreamResuIt 結果類型使用 HttpServletResponse 對象返回的 ServletOutputStrcam 對象,將下載文件的二進制數據輸出到客戶端,有以下參數:contentType發送到 Web 瀏覽器的數據流的 MIME 類型(默認為 text/plain)是下載文件的內容類型。
當客戶端向Tomcat請求靜態資源時,Tomcat會自動在Response Head中添加“Content-Type”屬性,并配置具體屬性列表。
contentLength
數據流的長度,以字節為單位(瀏覽器顯示進度條),即下載文件的長度
contentDisposition:
該屬性配置下載文件的文件名等屬性,其中文件類型分為inline和attachment: 1.inline:瀏覽
器嘗試直接打開文件(默認值)
也不是絕對的。這適用于瀏覽器可以顯示的下載。對于瀏覽器不支持的下載,即使使用了內聯選擇。
項目仍會彈出文件下載對話框。contentDispostion 的默認值是 inline。
inputName
Action 中用于下載文件的屬性名稱,類型為 InputStream。默認識別為 inputStream
inputName:用于指定下載文件的輸入流入口,需要在Action中指定。也就是說需要action定義對應的屬性類型InputStream。默認為輸入流。
如果在Action中聲明了getInputStream()方法,則在配置文件struts.xml中配置為<param name="inputName">inputStream</param>。
如果在 Action 中聲明了 getTargetFile() 方法,則配置文件 struts.xml 配置為<param name="inputName">targetFile </param>。
bufferSize
文件數據從輸入復制到輸出的緩沖區大小,默認1024字節
allowCaching
是否允許緩存
StreamResult 結果類型已在 struts-default 文件中定義為邏輯名稱流。
<結果名稱=“成功”類型=“流”> <param name="contentType">文本/純文本</param> <param name="inputName">輸入流</param> //這里的filename就是要下載的文件名。 <param name="contentDisposition">附件;filename="hello.txt"</param> <param name="bufferSize">1024</param> </結果>
<正文> <s:調試/> <s:a href="download?fileName=a.txt">下載一種方式</s:a> <a href="download?fileName=a.txt">向下模式二</a> </正文>
公共類 DownloadAction 擴展 ActionSupport { 私有字符串文件名; 公共輸入流 getInputStream() 拋出 IOException { 字符串路徑 = ServletActionContext.getServletContext().getRealPath(fileName); /** * 方法1 File file = new File(路徑);返回新的文件輸入流(文件); * 方法二 FileUtils.openInputStream(file); */ 文件文件 = 新文件(路徑); 返回 FileUtils.openInputStream(file); } 公共字符串 getFileName() { 返回文件名; } 公共無效 setFileName(字符串文件名){ this.fileName = 文件名; } @覆蓋 公共字符串執行()拋出異常{ 返回 super.execute(); } 公共無效setInputStream(輸入流輸入流){ } }
<動作 名稱="下載" 類="action.DownloadAction"> <結果名稱=“成功”類型=“流”> <param name="contentType">文本/純文本</param> <param name="inputName">輸入流</param> <param name="contentDisposition">附件;filename="hello.txt"</param> <param name="bufferSize">1024</param> </結果> </行動>
此時,不要忘記導入包,以及導入哪個包的FileUtils,仔細看import org.apache.commons.io.FileUtils;
缺點
如果要下載任意目錄下的文件(不僅僅是Web應用目錄),只需要修改action返回文件輸入流的方式,比如return new FileInputStream(inputPath)。
在實際應用中,下載的文件不應該配置在struts.xml文件中。如果是這樣,則相當于將 FileDownloadAction 的功能限制為僅下載一個文件。下載文件的選擇應該通過編碼來實現。根據瀏覽器的下載請求,查詢配置文件或數據庫,獲取真正的下載文件數據,構造inputStream對象。
對于下載的文件名和下載的文件類型,它們是在struts.xml 文件中配置的。如果用戶要下載的文件類型很多,這種方式顯然不夠靈活。
改進
為了動態設置文件類型和下載文件名,我們可以寫一個攔截器,在Action執行前動態添加StreamResult的參數,執行結果。
為了在結果執行之前攔截調用,我們需要使用 PreResultListener 接口,可以通過 Action lnvocation 注冊該接口,并在結果執行之前獲取回調。PreResultListener 需要在攔截器中注冊,所以我們需要編寫一個攔截器,然后
在攔截器方法中注冊一個 PreResultListener 實例。
java.lang.IllegalArgumentException:在調用堆棧中找不到名稱為 [inputStream] 的 java.io.InputStream。 檢查為此操作指定的 <param name="inputName"> 標記。 在 org.apache.struts2.result.StreamResult.doExecute(StreamResult.java:234) ERROR DefaultDispatcherErrorHandler 處理請求時發生異常: java.lang.IllegalArgumentException:在調用堆棧中找不到名稱為 [inputStream] 的 java.io.InputStream。 檢查為此操作指定的 <param name="inputName"> 標記。
這是因為 ServletActionContext.getServletContext().getResourceAsStream(path+fileName); 返回值為空。
以上就是關于“Struts2文件如何下載”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。