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>

 

posted @ 2014-11-13 16:18  兵古  阅读(216)  评论(0编辑  收藏  举报