struts2下载
如果直接将文件放在web应用的跟目录下,某些文件可
以下载(比如doc等文件),但是存在如下问题:
1.当文件名有中文字符时,就无法下载了
2.直接放在web应用的根目录,所有人都可下载该文件
,没有安全性
为了解决这两个问题,要通过sturts2的文件下载进行
控制
实现文件下载的action,关键只有一条:
提供一个返回值为inputstream的getter方法---该方法
代表了文件下载的入口,他就是我们要让客户下载的文
件的输入流
借助于struts的文件下载后,所有的文件下载都要经过
action的处理
因此acti on就可以对是否允许用户下载进行控制
废话不多说,上代码,包commons-fileupload-1.2.1.jar,mysql-connector-java-5.1.10-bin.jar等
action:
package com.gree.action; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; //此处是一个通用的文件下载action,如下内容是可变德1: //1.下载的目标资源2.下载的文件类型3。下载的文件名 public class DownLoad extends ActionSupport { private String res;//下载的资源的名字 private String resType;//下载的资源的文件类型 private String resName;//重定义下载的文件名 public String getRes() { return res; } public void setRes(String res) throws Exception { // 对res请求参数进行处理,中文名处理 this.res = new String(res.getBytes("iso-8859-1"),"utf-8"); } public String getResType() { return resType; } public void setResType(String resType) { this.resType = resType; } public String getResName() { return resName; } public void setResName(String resName) { this.resName = resName; } //该方法代表了文件下载的入口,他就是我们要让客户下载的文件的输入流 public InputStream getTarget() throws IOException{ //返回res资源所对应的输入流 return new FileInputStream(ServletActionContext.getServletContext().getRealPath("/")+res); } @Override public String execute() throws Exception { String userid=(String)ActionContext.getContext().getSession().get("userId"); //此方法是控制下载权限,只有登录用户才可下载
System.out.println("userid"+userid); if(userid==null){ addActionError("请先登录再下载!"); return ERROR; } return SUCCESS; } }
struts2.xml文件该action配置如下:
<action name="down" class="com.gree.action.DownLoad"> <result type="stream"> <!-- 该参数指定二进制流的类型 --> <param name="contentType">${resType}</param> <!-- 该参数返回InputStream方法 --> <param name="inputName">target</param> <param name="contentDisposition">filename=${resName}</param> <!-- 控制文件下载是换缓冲的大小 --> <param name="bufferSize">10000000</param> </result> <result name="error">login.jsp</result> </action>
upload.jsp页面中下载代码如下
<!-- 三个参数其中,res是服务器黄总目标资源的名称,resType是目标资源文件类型,其中文件类型可 在 tomcat安装路径下的conf文件夹下web.xml文件中获取,比如ppt的文件类型为application/vnd.ms-powerpoint, --> <!-- res重定义下载的名字 --> <a href="${pageContext.request.contextPath}/down?res=Excel.xlsx&resType=application/vnd.openxmlformats-officedocument.spreadsheetml.sheet&resName=new.xlsx">下载附件</a> <a href="${pageContext.request.contextPath}/down?res=开发日志.txt&resName=开发.txt">下载附件</a>