首页 > 代码库 > struts2下载

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>

 

struts2下载