Struts2 文件下载
页面jsp 页面代码
<table>
<tr>
<td>文件名</td>
<td>
<a href=”shop/ materialAction-matdownload?material.cmaterialId=对象Id”>下载</a>
<%--访问Action 中定义的下载方法传值Id--%>
</td>
</tr>
</table>
Action 代码
Public class MaterialAction{
private String matName; //下载资料名称
private Material material; //资料实例
/**
* 设置资料名称
* @param matName
*/
public void setMatName(String matName) {
this.matName = matName;
}
/**
* 获取资料名称
* @return
* @throws UnsupportedEncodingException
*/
public String getMatName() throws UnsupportedEncodingException {
//在服务器端通过设置http Header, 设置了客户端的默认的字符集编码
ServletActionContext.getResponse().setHeader("charset", "ISO8859-1");
return new String(this.matName.getBytes(),"ISO8859-1");
}
public String getMaterial(){
return material;
}
public String setMaterial(Material material){
this.material= material;
}
/**
* 课程资料下载
* @return
*/
public String matdownload(){
try {
material = materialBiz.findById(material.getCmaterialId());//根据资料Id 获取资料
setMatName(material.getDataName()); //资源原名字赋值给下载文件名
this.setMaterial(material); //把完整的资料详细赋值给下载资料
return "matDownload"; //对应于Struts2 配置文件的result name=”matDownload”
} catch (Exception e) {
e.printStackTrace();
return ERROR;
}
}
/**
* 下载课程资料下载方法
* @return
*/
public InputStream getMatdownloadFile() throws IOException{
String path = material.getDataAddress();//获取相对路径
InputStream is = ServletActionContext.getServletContext().getResourceAsStream(path);
return is;
}
}
Struts2 配置文件
<!-- 商城的package -->
<package name="shop" namespace="/shop" extends="qixuejia-default">
<action name=” materialAction-*” class=” MaterialAction” method=”{1}”>
<!--type 为 stream 应用 StreamResult 处理-->
<result name=”matDownload” type=”stream”>
<!--让浏览器知道文件类型 默以为 text/plain ‘application/x-msdownload’ 为web contentType全部类型-->
<param name="contentType">application/x-msdownload;charset=ISO8859-1</param>
<!-- 默认为 inline(在线打开),设置为 attachment 将会告诉浏览器下载该文件,filename 指定下载文件时的文件名,若未指定将会是以浏览的页面名作为文件名,如以 matName 作为文件名 -->
<param name="contentDisposition">attachment;filename=${matName}</param>
<!-- 默认就是 inputStream,它将会指示 StreamResult 通过 inputName 属性值的 getter 方法, 比如这里就是 getInputStream() 来获取下载文件的内容,意味着你的 Action 要有这个方法 -->
<param name="inputName">matdownloadFile</param>
<!-- 输出时缓冲区的大小 -->
<param name="bufferSize">2048</param>
<result>
</action>
</package>