zoukankan      html  css  js  c++  java
  • struts2-20-下载文件及授权控制

    下载文件:用<result-type>stream 而非拦截器

                 根目录=WebContent 

    一:下载文件主页面  downLoad.jsp

          

     1 <%@ page language="java" contentType="text/html; charset=UTF-8"
     2     pageEncoding="UTF-8"%>
     3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
     4 <html>
     5 <head>
     6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
     7 <title>下载文件页面</title>
     8 </head>
     9 <body>
    10   <a href="d:/zd.jpg">超链接下载图片文件</a><br>
    11   <a href="d:/zd.doc">超链接下载非图片文件</a><br>
    12   <!-- 超链接无法下载WEB-INF下文件,因为文件夹下的文件被保护 -->
    13   <a href="WEB-INF">下载WEB-INF下文件(超链接会出错404)</a><br>
    14   <!-- 下载到的文件必须加/  否则 -->
    15   <a href="downloadD?inputPath=d:/zd.jpg&contentType=image/jpeg&downFileName=ZD">非校验使用struts2下载D盘图片文件</a><br>
    16   <a href="ZddownloadD?inputPath=d:/zd.jpg&contentType=image/jpeg&downFileName=ZD">校验使用struts2下载D盘图片文件</a><br>
    17   <a href="downloadSC?inputPath=/zd.jpg&contentType=image/jpeg&downFileName=ZD">使用struts2下载 (ServletContext)当前的应用上下文中图片文件</a><br>
    18 </body>
    19 </html>

    二:配置struts.xml

     1 <?xml version="1.0" encoding="UTF-8" ?>
     2 <!DOCTYPE struts PUBLIC
     3     "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
     4     "http://struts.apache.org/dtds/struts-2.3.dtd">
     5 
     6 <struts>
     7  <constant name="struts.devMode" value="true" />
     8  <package name="default" namespace="/" extends="struts-default">
     9 
    10     <!-- 非权限下载D盘文件 -->
    11      <action name="downloadD" class="nuc.sw.zd.action.FileDownloadAction">
    12          <result name="success" type="stream">
    13              <!-- 指定下载文件的文件类型 -->
    14              <param name="contentType">${contentType}</param>
    15              <!-- 指定由getTargetFile方法返回被下载文件的 InputStream -->
    16              <param name="inputName">targetFileD</param>
    17              <!-- 指定下载文件的文件名 -->
    18             <param name="contentDisposition">filename="${downFileName}"</param>
    19             <!-- 指定文件的缓冲大小 -->
    20             <param name="bufferSize">4096</param>
    21          </result>
    22      </action>
    23      <!-- 权限下载D盘文件 -->
    24        <action name="ZddownloadD" class="nuc.sw.zd.action.ZdDownAction">
    25        <!-- 定义一个名为login的结果 -->
    26          <result name="login">/login.jsp</result>
    27          <result name="success" type="stream">
    28              <!-- 指定下载文件的文件类型 -->
    29              <param name="contentType">${contentType}</param>
    30              <!-- 指定由getTargetFile方法返回被下载文件的 InputStream -->
    31              <param name="inputName">targetFileD</param>
    32              <!-- 指定下载文件的文件名 -->
    33             <param name="contentDisposition">filename="${downFileName}"</param>
    34             <!-- 指定文件的缓冲大小 -->
    35             <param name="bufferSize">4096</param>
    36          </result>
    37      </action>
    38      
    39      <!-- 非权限下载应用上下文根目录下文件 -->
    40      <action name="loginAction" class="nuc.sw.zd.action.loginAction">
    41          <result name="success">/downLoad.jsp</result>
    42          <result name="input">/login.jsp</result>
    43      </action>
    44      <action name="downloadSC" class="nuc.sw.zd.action.FileDownloadAction">
    45          <result name="success" type="stream">
    46              <!-- 指定下载文件的文件类型 -->
    47              <param name="contentType">${contentType}</param>
    48              <!-- 指定由getTargetFile方法返回被下载文件的 InputStream -->
    49              <param name="inputName">targetFileSC</param>
    50              <!-- 指定下载文件的文件名 -->
    51             <param name="contentDisposition">filename="${downFileName}"</param>
    52             <!-- 指定文件的缓冲大小 -->
    53             <param name="bufferSize">4096</param>
    54          </result>
    55      </action>
    56  </package>
    57 </struts>

    三:写对应的调用方法  nuc.sw.zd.action

      (1)非权限下载文件(D盘  应用上下文根目录下文件)FileDownloadAction.java

        

    package nuc.sw.zd.action;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.InputStream;
    
    import org.apache.struts2.ServletActionContext;
    
    import com.opensymphony.xwork2.ActionSupport;
    
    public class FileDownloadAction extends ActionSupport {
      private String inputPath;
      private String contentType;
      private String downFileName;
    public String getInputPath() {
    	return inputPath;
    }
    public void setInputPath(String inputPath) {
    	this.inputPath=inputPath;
    	//this.inputPath=new String(inputPath.getBytes("ISO-8859-1"),"utf-8");
    }
    public String getContentType() {
    	return contentType;
    }
    public void setContentType(String contentType) {
    	this.contentType = contentType;
    }
    public String getDownFileName() {
    	return downFileName;
    }
    public void setDownFileName(String downFileName) {
    	this.downFileName = downFileName;
    }
     
    /*
      使用struts下载文件时,需要type=stream; 
      使用stream时指定inputName参数,即指定一个输入流。
      定义一个返回InputStream方法,作为被下载文件的入口。
     */
    public InputStream getTargetFileD() throws Exception{
    	
    	File file = new File("D:\zd.jpg"); 
    	InputStream is = new FileInputStream(file); 
    	return is;
    	}
    public InputStream getTargetFileSC() throws Exception{
    	InputStream in=ServletActionContext.getServletContext().getResourceAsStream(inputPath);
    	System.out.println(in);
    	return ServletActionContext.getServletContext().getResourceAsStream(inputPath);
    
    	}
    @Override
    	public String execute() throws Exception {
    		return SUCCESS;
    	}
    }
    

      

     (2)权限下载文件(D盘  应用上下文根目录下文件)ZdDownAction.java

     1 package nuc.sw.zd.action;
     2 
     3 import java.io.File;
     4 import java.io.FileInputStream;
     5 import java.io.InputStream;
     6 
     7 import com.opensymphony.xwork2.Action;
     8 import com.opensymphony.xwork2.ActionContext;
     9 import com.opensymphony.xwork2.ActionSupport;
    10 
    11 public class ZdDownAction extends ActionSupport {
    12     private String inputPath;
    13       private String contentType;
    14       private String downFileName;
    15     public String getInputPath() {
    16         return inputPath;
    17     }
    18     public void setInputPath(String inputPath) {
    19         this.inputPath=inputPath;
    20         //this.inputPath=new String(inputPath.getBytes("ISO-8859-1"),"utf-8");
    21     }
    22     public String getContentType() {
    23         return contentType;
    24     }
    25     public void setContentType(String contentType) {
    26         this.contentType = contentType;
    27     }
    28     public String getDownFileName() {
    29         return downFileName;
    30     }
    31     public void setDownFileName(String downFileName) {
    32         this.downFileName = downFileName;
    33     }
    34     public InputStream getTargetFileD() throws Exception{
    35         File file = new File("D:\zd.jpg"); 
    36         InputStream is = new FileInputStream(file); 
    37         return is;
    38     }
    39 @Override
    40     public String execute(){
    41         ActionContext ctx=ActionContext.getContext();
    42         String user=(String)ctx.getSession().get("user");
    43         if(user!=null && user.equals("zd")){
    44             System.out.print("用户名是:"+user);
    45             return SUCCESS;
    46         }
    47         else{
    48             this.addFieldError("error", "您还没有登录,请登录;");
    49             ctx.put("error","您还没有登录;");
    50             return Action.LOGIN;
    51         }
    52 }
    53     
    54 }

    (3)用户登录逻辑  loginAction.java

    四:项目结构

     五:运行结果

       主页面:

      可以图片另存为超链接下载图片:     可以图片另存为

      超链接下载非图片文件: 可以图片另存为

      超链接下载WEB-INF下的安全文件:

      有权限下载文件(未登录):

       无权限下载=登陆下载=

  • 相关阅读:
    366. Find Leaves of Binary Tree输出层数相同的叶子节点
    716. Max Stack实现一个最大stack
    515. Find Largest Value in Each Tree Row查找一行中的最大值
    364. Nested List Weight Sum II 大小反向的括号加权求和
    156. Binary Tree Upside Down反转二叉树
    698. Partition to K Equal Sum Subsets 数组分成和相同的k组
    244. Shortest Word Distance II 实现数组中的最短距离单词
    187. Repeated DNA Sequences重复的DNA子串序列
    java之hibernate之基于主键的双向一对一关联映射
    java之hibernate之基于主键的单向一对一关联映射
  • 原文地址:https://www.cnblogs.com/Z-D-/p/6053663.html
Copyright © 2011-2022 走看看