• 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下的安全文件:

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

       无权限下载=登陆下载=

  • 相关阅读:
    开发安全测试工具 ,推荐6款完全免费的工具
    Asp.net MVC 出现IQueryable<T> 未包含“Include”的定义
    Windows系统Git安装教程(详解Git安装过程)
    窗体进行自动适应窗口
    C# ObservableCollection两个字段排序的情况
    Advanced Installer 14.9 – WPF或winform应用程序打包成exe文件
    DotNetCore部署(IIS)踩坑记
    DotNetCore部署(IIS)文档
    windows系统中Dotnet core runtime 安装后,无法启动次程序,因为计算机中丢失api-ms-win-crt-runtime-l1-1-0.dll的解决方法
    解决Git在添加ignore文件之前就提交了项目无法再过滤问题
  • 原文地址:https://www.cnblogs.com/Z-D-/p/6053663.html
Copyright © 2020-2023  润新知