在网上查了很多,发现很多demo都是使用的struts2标签实现下载的,我自己在这里使用HTML写一个下载,方便自己理解
1、下载的链接
<a href="downloadFile.action">下载没有参数</a><br> <a href="downloadFileparam.action?directory=D:/&filename=log.txt">下载传递参数</a><br>
2、配置文件
<!-- 下载文件 --> <action name="downloadFile" class="downloadFileSpring"> <param name="directory">C:/dzh/internet/</param> <result name="success" type="stream"> <!-- 指定下载文件的内容类型,text/plain是默认类型 --> <param name="contentType">text/plain</param> <!-- inputName默认值是inputStream,如果action中用于读取下载文件内容的属性名是inputStream,那么可以省略这个参数 --> <param name="inputName">inputStream</param> <!--静态获取文件名,将文件名写死了即huangbiao.doc--> <param name="contentDisposition"> attachment;filename="huangbiao.doc" </param> <param name="bufferSize">2048</param> </result> <result name="input">/WEB-INF/pages/inputError.jsp</result> </action> <action name="downloadFileparam" class="hb.ajax.DownloadFileparam"> <!--默认的路径是c:/dzh/internet,但是如果传递了参数就会被覆盖--> <param name="directory">C:/dzh/internet/</param> <result name="success" type="stream"> <!-- 指定下载文件的内容类型,text/plain是默认类型 --> <param name="contentType">text/plain</param> <!-- inputName默认值是inputStream,如果action中用于读取下载文件内容的属性名是inputStream,那么可以省略这个参数 --> <param name="inputName">inputStream</param> <!--动态获取文件名,从Action中的取得filename--> <param name="contentDisposition"> attachment;filename=${filename} </param> <param name="bufferSize">2048</param> </result> <result name="input">/WEB-INF/pages/inputError.jsp</result> </action>
备注:
1、inputName是返回数据流的方法的名称,即配置文件根据它找到对应的方法接受数据流,默认是inputStream,也就是说如果配置文件中没有这个配置,那么在对应的action中要有getInputSteam()方法。
2、filename=${filename}需要对应的action中有对应的getFilename()方法
3、通过上面的配置文件可以看出,如果想实现全面的动态下载文件,就必须在上传文件的时候讲需要的信息——文件名称、文件类型、文件路径存储到数据库中,这样下载就能保证和上传是一致的(弹出下载对话框)。
3、对应的Action
package hb.ajax; import java.io.FileInputStream; import java.io.InputStream; import com.opensymphony.xwork2.ActionSupport; public class DownloadFile extends ActionSupport { private String filename; private String directory; public String getFilename() { return filename; } public void setFilename(String filename) { this.filename = filename; } public String getDirectory() { return directory; } public void setDirectory(String directory) { this.directory = directory; } @Override public String execute() throws Exception { System.out.println("success ---- jjj"); return "success"; } public InputStream getInputStream() throws Exception { //获取配置文件中的参数值,故打印的结果C:/dzh/internet/ System.out.println(this.directory); //配置文件中没有默认值,故打印的结果为null System.out.println(this.filename); String dir = directory + "aaa.docx"; return new FileInputStream(dir); // 如果dir是绝对路径 // return // ServletActionContext.getServletContext().getResourceAsStream(dir); // //如果dir是Resource下的相对路径 } }
package hb.ajax; import java.io.FileInputStream; import java.io.InputStream; import com.opensymphony.xwork2.ActionSupport; public class DownloadFileparam extends ActionSupport { private String filename; private String directory; public String getFilename() { return filename; } public void setFilename(String filename) { this.filename = filename; } public String getDirectory() { return directory; } public void setDirectory(String directory) { this.directory = directory; } @Override public String execute() throws Exception { System.out.println("success ---- jjj"); return "success"; } public InputStream getInputStream() throws Exception { // 有前端传递过来的参数,将默认的值覆盖了,故打印的结果D:/ System.out.println(this.directory); // 有前端传递过来的参数,故打印的结果为log.txt System.out.println(this.filename); String dir = directory + this.filename; return new FileInputStream(dir); // 如果dir是绝对路径 // return // ServletActionContext.getServletContext().getResourceAsStream(dir); // //如果dir是Resource下的相对路径 } }