下载文件:用<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下的安全文件:
有权限下载文件(未登录):
无权限下载=登陆下载=