五. 文件下载
在下载时,只需要指定文件的名称,就会去相应的文件目录中去寻找,去下载。
在该项目下新建一个upload文件夹,里面放置一些文件。
四.一 下载前查询所有的文件
一般在下载之前,会将可以下载的文件以列表的形式进行显示,或者将那个文件进行相应的显示。
五.一.一 创建 ShowFileAction
ShowFileAction中:
package com.yjl.web.action; import java.io.File; import java.util.ArrayList; import java.util.List; import org.apache.log4j.Logger; import org.apache.struts2.ServletActionContext; import com.yjl.pojo.User; import com.yjl.utils.BaseAction; /** * @author 两个蝴蝶飞 * @version 创建时间:Aug 28, 2018 8:35:56 AM * 关于文件上传和下载的Action实现 */ public class ShowFileAction extends BaseAction<User>{ private static final long serialVersionUID = 1L; private Logger logger=Logger.getLogger(FileAction.class); public String login(){ String path=getUploadPath(); logger.info("上传的路径是:"+path); return SUCCESS; } //要下载的文件 private List<File> downFileList=new ArrayList<File>(); public List<File> getDownFileList() { return downFileList; } public void setDownFileList(List<File> downFileList) { this.downFileList = downFileList; } public String downFileList(){ //1.找到path路径 String path=ServletActionContext.getServletContext().getRealPath("/upload"); File pFile=new File(path); //2.找到pFile文件夹下及下属文件夹下所有的文件。 List<File> temp=new ArrayList<File>(); //3.将所有的文件都放置到列表中 downFileList=ergodic(pFile, temp); logger.info("长度是:"+downFileList.size()); //4. 将集合转换成数组 return "downFileList"; } private List<File> ergodic(File file,List<File> resultFileList){ if(file==null||!file.exists()){ return new ArrayList<File>(); } File[] files = file.listFiles(); if(files==null||files.length<=0){ return new ArrayList<File>(); } for (File f : files) { if(f.isDirectory()){// 判断是否文件夹 ergodic(f,resultFileList);// 调用自身,查找子目录 }else{ resultFileList.add(f); } } return resultFileList; } }
在Action中看有的人是用的File []数组,这里用集合了,也是可以的。
五.一.二 配置 struts.xml 文件
在struts.xml中是正常的配置。
<!-- 下载文件显示 --> <action name="ShowFile_*" class="com.yjl.web.action.ShowFileAction" method="{1}"> <result name="success">/WEB-INF/content/success.jsp</result> <result name="downFileList">/WEB-INF/content/list.jsp</result> </action>
五.一.三 编写 /content/list.jsp 页面
<body> 这是可以下载文件的列表<br/> <s:iterator value="downFileList" var="f"> <s:property value="#f.name"/><s:a action="getDownFile?fileName=%{#f.name}" namespace="/">下载</s:a> <br/> </s:iterator> </body>
五.一.四 重启服务器,验证界面
输入网址: http://localhost:8080/Struts_File/ShowFile_downFileList
会显示可以下载的文件:
五.二 下载文件
五.二.一 编写 DownFileAction
主要的Action代码:
public class DownFileAction extends ActionSupport{ private static final long serialVersionUID = 1L; //@param fileName 下载时传入的文件名 private String fileName; //下载时,显示的文件名 private String showFileName; //文件类型 private String contentType; public String getFileName() { return this.fileName; } public void setFileName(String fileName) { //如果前台传入的是中文乱码,那么需要进行乱码处理. //如果前台传入的不是乱码,那么不需要进行处理。 this.fileName=fileName; /*try { this.fileName=new String(fileName.getBytes("ISO-8859-1"),"UTF-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); }*/ } /** * 获取文件的类型 */ public String getContentType() { return ServletActionContext.getServletContext().getMimeType(fileName); } public void setContentType(String contentType) { this.contentType = contentType; } public String getShowFileName() { return showFileName; } public void setShowFileName(String showFileName) { this.showFileName=showFileName; } public InputStream getDownloadFile() throws Exception{ //设置一下,展示的名称。 setShowFileName(fileName); String realPath=File.separator+"upload"+File.separator+fileName; InputStream is=ServletActionContext.getServletContext().getResourceAsStream(realPath); return is; } public String download(){ return SUCCESS; } }
五.二.二 配置struts.xml 文件
<!-- 配置下载页面 --> <action name="getDownFile" class="com.yjl.web.action.DownFileAction" method="download"> <!--下载时候的配置--> <result type="stream"> <!--文件类型 --> <param name="contentType">${contentType}</param> <!-- 下载的文件数据存放的方法,该方法返回一个InputStream 例如取值为inputStream的属性需要编写getInputStream()方法--> <param name="inputName">downloadFile</param> <!--下载时,客户端显示的下载的文件名 --> <param name="contentDisposition">attachment;filename=${showFileName}</param> <!-- 数据的缓冲大小 --> <param name="bufferSize">1024</param> <!--解决中文文件名乱码--> <param name="encode">true</param> </result> </action>
五.二.三 下载验证
输入网址: http://localhost:8080/Struts_File/ShowFile_downFileList
点击链接,可以进行下载, 但是下载中文时, 火狐浏览器会乱码,而谷歌浏览器正常。
本章节的代码链接为:
链接:https://pan.baidu.com/s/1P9bA-OX__modBaQHg7HO6g 提取码:lm3v
谢谢您的观看!!!