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

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

 

   无权限下载=登陆下载=

 

posted @ 2016-11-11 11:37  ~花开不败~  阅读(272)  评论(0编辑  收藏  举报