1.文件下载的概述:
* 将服务器端的文件下载到本地,有两种方式可以实现文件的下载
> 超链接文件下载(浏览器可以解析文件,默认打开了)
> 编写文件下载的程序(可以弹出文件的下载的窗口)
* 记住那句话:两个头一个流。
> Content-Type -- 是文件的MIME的类型(使用ServletContext.getMimeType(文件名称))
> Content-Disposition -- 值是attachment;filename=文件名称(中文文件名称是乱码的!!判断浏览器,不同浏览器采用不同的编码)
> 获取文件的输入流 --
2.编写文件下载的JSP页面,提供超链接点击下载。
* 超链接把文件名称传入到后台程序,会产生乱码的问题。
* 要解决GET方式的中文乱码问题。
3.如果想完成文件下载,Action类必须要有返回结果,并且返回结果中必须要依赖stream结果类型。
* 在<action>标签中配置stream的结果类型。
* 可以通过<result-type name="stream" class="org.apache.struts2.dispatcher.StreamResult"/>源码发现有一些需要设置的属性。
<result name="success" type="stream">
<param name="contentType">${contentType}</param>
<param name="contentDisposition">attachment;filename=${fileName}</param>
<param name="inputName"></param>
</result>
* 上面的代码的${contentType}这种写法需要Action类提供对应的方法,对应的方法如下
// 获取文件的MIME类型
public String getContentType(){
return ServletActionContext.getServletContext().getMimeType(filename);
}
// 设置文件的输入流
public InputStream getInputStream(){
return ServletActionContext.getServletContext().getResourceAsStream("/download/"+filename);
}
// 设置Content-Disposition属性
public String getDownFilename() throws IOException{
String agent = ServletActionContext.getRequest().getHeader("User-Agent");
return this.encodeDownloadFilename(filename, agent);
}
4.解决下载文件中文乱码的问题
public String encodeDownloadFilename(String filename, String agent) throws IOException{
if(agent.contains("Firefox")){ // 火狐浏览器
filename = "=?UTF-8?B?"+new BASE64Encoder().encode(filename.getBytes("utf-8"))+"?=";
}else{ // IE及其他浏览器
filename = URLEncoder.encode(filename,"utf-8");
}
return filename;
}
Struts2的文件下载
最新推荐文章于 2019-07-09 23:31:00 发布