zoukankan      html  css  js  c++  java
  • 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>
  • 相关阅读:
    kubernetes dashboard 二次开发
    grafana二次开发
    Harbor 定制页面 和 二次开发指南
    spring boot 知识点1
    spring boot2.1读取 apollo 配置中心3
    apollo 部门管理
    spring boot2.1读取 apollo 配置中心2
    a 产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复。
    Net上机考试
    Net(ASP.NET)程序设计
  • 原文地址:https://www.cnblogs.com/binggu/p/4095233.html
Copyright © 2011-2022 走看看