1:struts2配置文件如下:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <constant name="struts.enable.DynamicMethodInvocation" value="false" /> <constant name="struts.devMode" value="false" /> <constant name="struts.multipart.maxSize" value="2073741824" /> <package name="logsin" extends="struts-default"> <action name="download" class="com.dingxun.download.DownloadAction"> <interceptors> <interceptor name="downloadinterceptor" class="com.dingxun.download.DownloadInterceptor"> </interceptor> <interceptor-stack name="myinterceptor"> <interceptor-ref name="downloadinterceptor" /> <interceptor-ref name="defaultStack"></interceptor-ref> </interceptor-stack> </interceptors> <default-interceptor-ref name="myinterceptor"></default-interceptor-ref> <global-results> <result name="login">/login.jsp</result> </global-results> <result name="success" type="stream"> <param name="contentType">application/octet-stream</param> <param name="inputName">inputStream</param> <param name="contentDisposition">attachment;filename="${file}"</param> <param name="bufferSize">5120</param> </result> </action> </package> <!-- <include file="example.xml"/> --> <!-- Add packages here --> </struts>
备注1
contentType:指定被下载文件的文件类型。 application/octet-stream 默认值,可以下载所有类型
inputName:指定被下载文件的入口输入流, 和DownloadAction中的getInputStream()对应,主要是获得实际资源文件
contentDisposition:指定下载的文件名,一般和文件名一致,但是要注意中文件名保存时乱码问题,解决办法就是进行编码处理
如:<param name="contentDisposition">attachment;filename="${file}"</param> 要求DownloadAction中的getFile()返回的文件名编码方式为
ISO8859-1,所以要进行下面处理:
public String getFile() {
String fileName= "";
try {
fileName = new String(file.getBytes(),"ISO8859-1"); //把file转换成ISO8859-1编码格式
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return fileName;
}
bufferSize:指定下载文件时的缓冲大小。
备注2
<result name="success" type="stream"> 要注意的是result的type类型要为:stream
备注3
上面的拦截器主要是用来设置下载权限的,如果用户没有登陆则不能下载,在配置拦截器时间要注意顺序问题
2:DownloadAction代码如下:
import java.io.InputStream; import java.io.UnsupportedEncodingException; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; public class DownloadAction extends ActionSupport{ private String file; // 需要下载的文件名,通过链接传过来 //getFile()是处理保存中文文件名带来的问题,主要是用来处理保存文件时中文名字乱码问题 public String getFile() { String fileName= ""; try { fileName = new String(file.getBytes(),"ISO8859-1"); //把file转换成ISO8859-1编码格式 } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return fileName; } public void setFile(String file) { this.file = file; } // 对于上边的文件路径,给出他的输入流(实际文件资源),对应在配置文件中的InputName属性名 public InputStream getInputStream() { System.out.println("得到实际文件资源file:"+file); InputStream o = ServletActionContext.getServletContext().getResourceAsStream( "upload//" + file); return o; } // execute方法只需返回SUCCESS public String execute() throws Exception { return SUCCESS; } }
3:jsp页面如下:
<%@ page language="java" contentType="text/html; charset=GBK" pageEncoding="GBK"%> <%@ taglib prefix="s" uri="/struts-tags" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=GBK"> <title>Insert title here</title> </head> <body> <a href="download.action?file=execute.jar" mce_href="download.action?file=execute.jar">execute.jar</a><br> <a href="download.action?file=close.jar" mce_href="download.action?file=close.jar">close.jar</a><br> <a href="download.action?file=CMOS.txt" mce_href="download.action?file=CMOS.txt">CMOS.txt</a><br> <a href="download.action?file=截图00.jpg" mce_href="download.action?file=截图00.jpg">截图00.jpg</a><br> <a href="download.action?file=030484-01.doc" mce_href="download.action?file=030484-01.doc">030484-01.doc</a><br> </body> </html>
注意
这里唯一要说明的一点是链接包含有中文的时候处理办法,因为链接的实际上是按get方式传送的,所以可以在Tomcat中做处理
在server.xml中加入URIEncoding="编码格式"
如:<Connector port="8080" maxHttpHeaderSize="8192"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="GBK" />
但还有一点要注意,那就是URIEncoding的编码格式要和页面的编码格式相同