访问页面:
<body>
<a href="${pageContext.request.contextPath }/DownloadAction2?filename=ss.txt">下载ss.txt</a>
<a href="${pageContext.request.contextPath }/DownloadAction2?filename=密码.flv">下载密码</a>
</body>
下载文件的Action:
package com.itcast.action;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
import sun.misc.BASE64Encoder;
public class DownloadAction2 extends ActionSupport{
private String filename; //准备下载的文件的名称
private String contentType; //准备下载文件的类型,MimeType.
//处理文件的名称
public String getFilename() throws UnsupportedEncodingException {
//对不同浏览器传递过来的文件名进行编码,这里应该是服务器在将文件发送给浏览器的时候,根据不同的浏览器而对文件名编码,以便下载的文件名(中文)能够正常显示.
return encodeDownloadFilename(filename,
ServletActionContext.getRequest().getHeader("User-Agent"));
}
public void setFilename(String filename) throws UnsupportedEncodingException {
//对文件名称编码,这里是浏览器发送请求到服务器时,服务器对携带的文件名进行解码和编码.
filename = new String(filename.getBytes("iso8859-1"), "utf-8");
this.filename = filename;
}
//处理文件的类型
public String getContentType() {
return ServletActionContext.getServletContext().getMimeType(filename);
}
public void setContentType(String contentType) {
this.contentType = contentType;
}
//下载文件的入口
public InputStream getDownFile() {
//要下载的文件的路劲
String filepath = "/save/" + filename;
return ServletActionContext.getServletContext().getResourceAsStream(filepath);
}
@Override
public String execute() throws Exception {
return SUCCESS;
}
/**对不同浏览器传递过来的文件名称进行转码
* name:文件名称
* agent:浏览器
* return 返回转码后的名称
*/
public String encodeDownloadFilename(String name,String agent) throws UnsupportedEncodingException {
if (agent.contains("Firefox")) { //火狐浏览器
name="=?UTF-8?B?" + new BASE64Encoder().encode(name.getBytes("utf-8")) + "?=";
} else { //IE及其它浏览器
name = URLEncoder.encode(name, "utf-8");
}
return name;
}
}
配置文件:
<!--解决了下载中文名字文件乱码问题的action -->
<action name="DownloadAction2" class="com.itcast.action.DownloadAction2">
<result type="stream">
<!--文件的类型 使用OGNL表达式获取\值栈 -->
<param name="contentType">${contentType}</param>
<!--文件的下载方式和名字 使用OGNL表达式获取 -->
<param name="contentDisposition">
attachment;filename=${filename}
</param>
<!--下载文件的入口 -->
<param name="inputName">DownFile</param>
<!-- 下载缓存大小 -->
<param name="bufferSize">1024</param>
</result>
</action>
配置文件中${filename} 和${contentType}相当于action.getFilename()和action.getContentType()