struts2实现文件下载

来源:互联网 发布:python logger 编辑:程序博客网 时间:2024/06/08 06:10

要下载文件,首先要获取文件列表

创建action

public class DownloadAction extends ActionSupport{private File[] files;public String list(){//取得文件保存路径String path=ServletActionContext.getServletContext().getRealPath("/upload");File f=new File(path);//获取目录下保存的文件files=f.listFiles();return "list";}//省略get/set}
配置struts.xml

<action name="*down" class="base.MyFileUpload" method="{1}"><result name="list">/filelist.jsp</result></action>
前台页面显示,filelist.jsp

<body>    <c:forEach items="${files }" var="f">    ${f.name}<a href="listdownload.action?filename=${f.name }">下载</a><br>    </c:forEach></body>
点击下载链接,将文件名传入后台,

修改action代码

public class DownloadAction extends ActionSupport{private File[] files;private String fileName;public String list(){//取得文件保存路径String path=ServletActionContext.getServletContext().getRealPath("/upload");File f=new File(path);//获取目录下保存的文件files=f.listFiles();return "list";}public InputStream  getDownloadFile() throws Exception{String filePath = ServletActionContext.getRequest().getServletContext().getRealPath("/upload/"+fileName);InputStream is = new FileInputStream(new File(filePath));//解决下载文件名称问题fileName=URLEncoder.encode(fileName, "UTF-8");return is;}public void setFileName(String fileName) throws UnsupportedEncodingException {//处理get请求中文乱码this.fileName = new String(fileName.getBytes("iso8859-1"),"utf-8");}public File[] getFiles() {return files;}public void setFiles(File[] files) {this.files = files;}public String getFileName() {return fileName;}}

修改struts.xml文件

<action name="*down" class="base.DownloadAction" method="{1}"><result name="list">/filelist.jsp</result><result type="stream"><!-- 下载的文件数据存放的方法,该方法返回一个InputStream 例如取值为inputStream的属性需要编写getInputStream()方法--><param name="inputName">downloadFile</param><!--下载时,客户端显示的下载的文件名 --><param name="contentDisposition"> attachment; filename=${fileName}</param><!-- 数据的缓冲大小 --><param name="bufferSize">1024</param></result></action>
其中attachment;filename="struts2.txt",设置浏览器以下载的方式打开文件,文件下载的时候保存的名字应为struts2.txt,如果直接写filename="struts2.txt",那么默认情况是代表inline,浏览器会尝试自动打开它,

等价于这样的写法:inline; filename="struts2.txt"