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中的配置,向浏览器返回一个输入流,并告知浏览器将此输入流的数据保存为指定文件。