最近在做一个小程序,要求能把查询记录导成excel并供前端下载。
1).导出excel功能使用jxl实现(当然也可以使用功能更强的poi,但小巧的jxl性能更好些)。
2).下载功能却遇到点小问题。
struts配置:
<action name="download" class="com.harmonywisdom.emergency.smsplatform.action.DownloadAction"> <result name="success" type="stream"> <!--设置为excel类型 --> <param name="contentType">application/vnd.ms-excel;charset=ISO8859-1</param> <!--下载文件流 --> <param name="inputName">inputStream</param> <!--添加参数,即就是下载的名称 --> <param name="contentDisposition">attachment;filename="${fileName}"</param> <!--缓存 --> <param name="bufferSize">4096</param> </result> </action>
这里的几个参数都很重要,首先是result的类型是stream, 其次contentType指明excel,接着是action要有getInputStream()方法,下面就是contentDisposition必须有attachment属性,代表是作为附件下载而不是直接打开。filename就是传给action的文件名,通过getInputStream()返回该文件的流。一切都没有问题。
ajax请求
前端页面采用的ajax请求下载,遇到了麻烦,无论get还是post都不行,就是弹不出保存文件对话框,如果浏览器收到了文件流就会自动弹出保存框。这说明浏览器确实没有收到流,F12查看下ajax请求,果然,成功收到了响应,但响应内容都是字符串。呀,ajax接收的内容本来就都会转成字符串(xml或text)的。所以不能采用ajax来请求下载。
2. 解决
很明确,把ajax改成下面即可:
location.href="/app/sms/download.action?fileName=" + data;
或者其他解决办法,比如设置一个<a>标签,href请求action。总之要保证浏览器收到的是流,而不是字符串。