一、在服务器的应用中存在如下文件:常用网站.txt;
二、struts-download.xml中的内容如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="download" namespace="/" extends="struts-default">
<action name="fileDownload" class="com.summer.action.DownloadAction" >
<!-- struts2中的type="stream"的result用于文件下载 -->
<result type="stream" name="success">
<!-- 以下参数可以在action中以getter方法的方式提供 -->
<!-- 下载文件的类型,只有在下载时才知道,因此在action中以getter方法的方式出现 -->
<param name="contentType">application/zip; text/plain</param>
<!-- 下载文件的长度,只有在下载时才知道,因此在action中以getter方法的方式出现 -->
<!-- <param name="contentLength"></param> -->
<!-- 设定contentDisposition响应头为文件下载类型,一般取值为attachment;fileName="fileName" -->
<!-- fileName=指定下载后的文件名,一般沿用原文件名${fileName} -->
<!-- <param name="contentDisposition">attachment;filename="${fileName}"</param> -->
<!-- 指定文件输入流的入口,即输入流的名称,默认值是inputStream -->
<param name="inputName">inputStream</param>
<!-- 设定缓存的大小,默认是1024 -->
<param name="bufferSize">4056</param>
<!-- 是否允许使用缓存,默认值是true -->
<param name="allowCaching">true</param>
<!-- 指定下载的字符集,默认是utf-8 -->
<param name="contentCharSet">utf-8</param>
</result>
</action>
</package>
</struts>
三、action中的代码:
package com.summer.action;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
/**
* struts2文件下载及下载文件名中文乱码
*
* @author Administrator
*
*/
public class DownloadAction extends ActionSupport {
/**
*
*/
private static final long serialVersionUID = -2441651387272051445L;
private InputStream inputStream;
private String fileName;
public InputStream getInputStream() throws FileNotFoundException,
UnsupportedEncodingException {
fileName = "常用网站.txt";
inputStream = ServletActionContext.getServletContext()
.getResourceAsStream("download/" + fileName);
// 解决中文文件名称乱码问题
ServletActionContext.getResponse().setHeader(
"Content-Disposition",
"attachment;fileName="
+ java.net.URLEncoder.encode(fileName, "UTF-8"));
return inputStream;
}
public void setInputStream(InputStream inputStream) {
this.inputStream = inputStream;
}
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
@Override
public String execute() throws Exception {
return SUCCESS;
}
}
四、效果图: