jsp <body> <a href="DownloadAction?fileName=荷花.txt">下載文檔</a> <br /> <a href="DownloadAction?fileName=荷花.jpg">下載圖片</a> <br /> </body> fileName帶文件名尾碼。 a ...
jsp
<body> <a href="DownloadAction?fileName=荷花.txt">下載文檔</a> <br /> <a href="DownloadAction?fileName=荷花.jpg">下載圖片</a> <br /> </body>
fileName帶文件名尾碼。
action
public class DownloadAction extends ActionSupport { private String fileName; public String getFileName() { return fileName; } public void setFileName(String fileName) { this.fileName = fileName; } public InputStream getInputStream(){ return ServletActionContext.getServletContext().getResourceAsStream("resource/" + fileName); } @Override public String execute() throws Exception { return SUCCESS; } }
- 一個String類型的成員變數表示文件名,並提供對應的getter、setter方法
- 一個獲取輸入流的方法,返回該文件的輸入流。也可以寫成 new FileInputStream() 。
- 一個要調用的方法
struts.xml
<action name="DownloadAction" class="action.DownloadAction"> <result name="success" type="stream"> <!-- 指定action中獲取輸入流的方法,getInputStream,約定:去掉get,後面部分轉化為camel寫法 --> <param name="inputName">inputStream</param> <!-- 設置瀏覽器對此stream(輸入流)的處理方式:保存為文件,filename指定文件名 --> <param name="contentDisposition">attachment;filename=${fileName}</param> <!-- 設置緩衝大小,預設單位位元組 --> <param name="bufferSize">4096</param> <!-- 解決中文文件名出錯 --> <param name="encode">true</param> </result> </action>
流程分析
- 瀏覽器向伺服器發送請求,將fileName傳遞給action
- JVM創建action實例,並調用action的setFileName()將瀏覽器傳過來的文件名賦給成員變數fileName,完成成員變數的初始化
- JVM調用action的execute()來處理瀏覽器的請求,返回SUCCESS,JVM根據struts.xml中的配置,向瀏覽器返回一個輸入流,並告知瀏覽器將此輸入流的數據保存為指定文件。