1、客户端jsp请求Actin
-
<%@
page language="java" import="java.util.*" pageEncoding="UTF-8"%> -
<%
-
String path = request.getContextPath(); -
String basePath = request.getScheme() + "://" -
+ request.getServerName() + ":" + request.getServerPort() -
+ path + "/"; -
%>
-
-
<!DOCTYPE
html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" -
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> -
<html>
-
<head> -
<title>Struts2的文件下载</title> -
<meta name="website" content="http://www.crazyit.org" /> -
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> -
</head> -
-
<body> -
<h1> -
Struts2的文件下载 -
</h1> -
<ul> -
<li> -
下载Struts2的Logo: -
<a href="download.action">下载图形文件</a> -
</li> -
<li> -
下载Struts2的Logo的压缩文件: -
<a href="download2.action">下载压缩文件</a> -
</li> -
</ul> -
</body> -
</html>
2、Action处理
Struts2的文件下载Action与普通的Action并没有太大的不同,仅仅是该Action需要提供一个返回InputStream流的方法,该输入流代表了被下载文件的入口。该Action类的代码如下:
-
package
com.lbx.action; -
-
import
java.io.InputStream; -
-
import
org.apache.struts2.ServletActionContext; -
-
import
com.opensymphony.xwork2.ActionSupport; -
-
@SuppressWarnings("serial")
-
public
class FileDownloadAction extends ActionSupport{ -
//依赖注入的属性,struts.xml中动态的指定 -
private String inputPath; -
-
//只需要set方法 -
public void setInputPath(String inputPath) { -
this.inputPath = inputPath; -
} -
-
-
public InputStream getTargetFile() throws Exception{ -
return ServletActionContext.getServletContext() -
.getResourceAsStream(inputPath); -
} -
-
}
从上面的Action中看到,该Action中包含了一个getTargetFile()方法,该方法返回一个InputStream输入流,这个输入流返回的是下载目标文件的入口。该方法的方法名为getTargetFile,表明该Action有一个targetFile属性来返回下载文件。
3、struts.xml配置
配置该文件下载的Action与配置普通的Action并没有太大的不同,需要在配置普通Action的基础之上,在加上额外的download的拦截器引用。
除此之外,关键是需要配置一个类型为stream的结果,配置stream类型的结果时需要指定如下四个属性:
contentType:指定被下载文件的文件类型。
inputName:指定被下载文件的入口输入流。
contentDisposition:指定下载的文件名。
bufferSize:指定下载文件时的缓冲大小。
因为stream结果类型的逻辑视图是返回给客户端一个输入流,因此无需指定location属性。
提示:配置stream类型的结果时,因为无需指定实际的显示的物理资源,所以无需指定location属性,只需要指定inputName属性,该属性指向被下载文件。
-
<?xml
version="1.0" encoding="UTF-8"?> -
<!DOCTYPE
struts PUBLIC -
"-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" -
"http://struts.apache.org/dtds/struts-2.1.dtd"> -
<struts>
-
-
<constant name="struts.i18n.encoding" value="UTF-8"/> -
-
<package name="lee" extends="struts-default"> -
-
<action name="download" class="com.lbx.action.FileDownloadAction"> -
<!-- 指定被下载资源的位置 --> -
<param name="inputPath">\images\Java.gif</param> -
<!-- 配置结果类型为stream的结果 --> -
<result name="success" type="stream"> -
<!-- 指定下载文件的文件类型 --> -
<param name="contentType">image/gif</param> -
<!-- 指定由getTargetFile()方法返回被下载文件的InputStream --> -
<param name="inputName">targetFile</param> -
<param name="contentDisposition">filename="crazyit.gif"</param> -
<!-- 指定下载文件的缓冲大小 --> -
<param name="bufferSize">4096</param> -
</result> -
</action> -
-
<action name="download2" class="com.lbx.action.FileDownloadAction"> -
<!-- 定义被下载文件的物理资源 --> -
<param name="inputPath">\images\crazyit.zip</param> -
<result name="success" type="stream"> -
<!-- 指定下载文件的文件类型 --> -
<param name="contentType">application/zip</param> -
<!-- 指定由getTargetFile()方法返回被下载文件的InputStream --> -
<param name="inputName">targetFile</param> -
<param name="contentDisposition">filename="crazyit.zip"</param> -
<!-- 指定下载文件的缓冲大小 --> -
<param name="bufferSize">4096</param> -
</result> -
</action> -
-
</package> -
</struts>