Struts2提供了对文件下载的支持,使得我们可以轻松的实现文件下载功能。
1、实现文件下载
1、实现下载的Action
public class DownloadAction extends ActionSupport {
private static final long serialVersionUID = 1L;
//待下载文件的完整文件名(仅仅用于测试实现下载功能)
private String fileName = "F:\\uploads\\20springmvc注解开发-商品修改功能开发controller.avi";
//下载时使用该属性对文件重命名,默认值为default_file_name
private String downFileName = "default_file_name";
/**
* @return 返回一个指向待下载文件的输入流
* @throws IOException
*/
public InputStream getDownloadFile() throws IOException
{
return new FileInputStream(new File(fileName));
}
public String execute() throws UnsupportedEncodingException
{
//获取文件的原始文件名,包括扩展名
downFileName = fileName.substring(fileName.lastIndexOf("\\", fileName.length()-1)+1);
//解决文件下载时不能正确获取中文文件名的问题
downFileName =new String( downFileName.getBytes("UTF-8"),"ISO8859-1");
return SUCCESS;
}
2、Action配置
<action name="download" class="downloadAction">
<!-- stream类型的result用于文件下载 -->
<result type="stream" name="success">
<!-- 指定下载文件的类型:未知类型时采用application/octet-stream -->
<param name="contentType">application/octet-stream;charset=UTF-8</param>
<!-- attachment指定浏览器不会试图打开该文件,而是直接下载;fileName指定下载时显示的文件名(${downFileName}动态的获取Action中downFileName属性的值) -->
<param name="contentDisposition">attachment;fileName="${downFileName}"</param>
<!-- 指定用于下载的输入流:获取输入流的方法的方法名去掉get后,首字母小写后的内容,如getDownloadFile()-->
<param name="inputName">downloadFile</param>
<!-- 指定缓冲池大小,单位为字节 -->
<param name="bufferSize">2048</param>
</result>
</action>
2、关于Struts2实现文件下载的各项笔记
使用Struts2下载文件,只需获取一个指向待下载文件的输入流即可,Struts2会将文件以流的方式下载至客户端
关于Action的配置说明
1)、首先要设置result的type属性为< result type=”stream” name=”success”>,与之对应的处理类是 org.apache.struts2.dispatcher.StreamResult
2)、在result中配置4项参数:
< param name=”contentType”>:内容类型,和互联网MIME标准中的规定类型一致,例如text/plain代表纯文本,text/xml表示XML,image/gif代表GIF图片,image/jpeg代表JPG图片,由于事先不知道待下载文件的类型,所以使用 application/octet-stream;charset=UTF-8,此时浏览器会以字节流的方式处理,也就是下载了。
< param name=”contentDisposition”> :contentDisposition有两种取值,默认是 inline(内联的)。
(a.)inline :此时浏览器会试图打开待下载的文件,比如说下载的文件是文本类型的,就直接在网页上打开,浏览器不能直接打开的才会打开下载框下载到本地。
(b.)attachment :浏览器不尝试打开该文件,而是直接打开下载框进行下载。
(c.) fileName=”${downFileName}” :在这定义的名字是一个动态的,该名字是显示在下载框上的文件名字(chrome下直接以该名字进行下载 )< param name=”inputName”> :指定获取输入流的方法,struts2会自动调用该方法。该属性值要和Action中获取输入流的方法的方法名去掉get后一致(当然首字母要小写);如getDownloadFile()方法名去掉get 后, downloadFile
< param name=”bufferSize”> : 设置缓冲区大小 ,以字节为单位
3)、contentType属性和contentDisposition分别对应着HTTP响应中的头Content-Type和Content-disposition头。
4)、如果下载的文件名含有中文,可能无法正确获取中文内容。
解决方案:
在Action中 对文件名进行处理
downFileName =new String( downFileName.getBytes(“UTF-8”),”ISO8859-1”);
或者 设置
response.setHeader(“Content-Disposition”, “attachment;fileName=”
+ java.net.URLEncoder.encode(downFileName ,”UTF-8”));
参考
http://blog.youkuaiyun.com/big1980/article/details/8581038?locationNum=14&fps=1
http://blog.youkuaiyun.com/hzc543806053/article/details/7538723