废话不多说了,直接上源码,一切尽在注解中:
package study.action;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import javax.servlet.ServletContext;
import org.apache.struts2.util.ServletContextAware;
import com.opensymphony.xwork2.ActionSupport;
/**
* Struts2文件下载功能实现
*
* @author Echo
*
*/
public class DownloadAction extends ActionSupport implements
ServletContextAware {
/** 序列化 */
private static final long serialVersionUID = 1L;
/** 上下文环境,用于获取文件路径 */
private ServletContext context;
/** 文件名,可以动态指定 */
private String filename = "wusuowei";
/** 动态指定MIME类型 */
private String mimeType;
/** 需要下载的文件流 */
private InputStream inStream;
@Override
public String execute() throws Exception {
mimeType = context.getMimeType(filename);
return SUCCESS;
}
public InputStream getInStream() {
// 查找指定文件
inStream = context.getResourceAsStream("/doc/" + filename);
if (inStream == null) { // 如果没有找到到指定文件将指定信息写入下载流中
inStream = new ByteArrayInputStream("Sorry,File not found !"
.getBytes());
}
return inStream;
}
public String getMimeType() {
return mimeType;
}
public void setFilename(String filename) {
try {
// 将文件名编码
this.filename = new String(filename.getBytes("ISO8859-1"), "GBK");
} catch (UnsupportedEncodingException e) {
}
}
public String getFilename() {
try {
// 将文件名解码
return new String(filename.getBytes(), "ISO8859-1");
} catch (UnsupportedEncodingException e) {
return this.filename;
}
}
public void setServletContext(ServletContext context) {
this.context = context;
}
}
struts.xml配置文件:
<?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>
<package name="zyc" extends="struts-default" namespace="/">
<action name="download" class="study.action.DownloadAction">
<!-- 指定Action返回success下载流对象 -->
<result type="stream" name="success">
<!-- 文件类型,与Action中的mineType对映 -->
<param name="contentType">${mimeType}</param>
<!-- 指定文件的输入流对象,与Actiono中的InputStream对映 -->
<param name="inputName">inStream</param>
<!-- 文件名,与Action中对映 -->
<param name="contentDisposition">attachment;filename="${filename}"</param>
<!-- 指定缓冲区大小 -->
<param name="bufferSize">1024</param>
</result>
</action>
</package>
</struts>
剩下的内容你懂得,把这个Action嵌套到JSP页面上点击就可以下载相应内容。