下载文件(前端+后台)
1,页面
<a href="javascript:void(0)" class="btn buttonBox btn-primary " onclick="downloadExampleDataTemplate()" style="background-color: #1ab394;border-color: #1ab394;height: 32px;">下载样例模版</a>
2,js
//下载样例模板 function downloadExampleDataTemplate() { var id = $("#id").val(); window.location.href="downloadExampleDataTemplate?id="+id; }
3,后台
/** * 下载文件 * @param response * @param fileName 文件名称 * @author * @date 2018/3/31 */ public static void downFile(HttpServletResponse response, String fileName, String templateUrl) { String filePath = templateUrl+fileName+".xls"; //读取要下载的文件,保存到文件输入流 try { // 设置头部信息 response.setHeader( "Content-disposition", "attachment;filename=" + URLEncoder.encode(fileName+".xls", "UTF-8")); FileInputStream in = new FileInputStream(filePath); //创建输出流 OutputStream out = response.getOutputStream(); //创建缓冲区 byte buffer[] = new byte[1024]; int len = 0; //循环将输入流中的内容读取到缓冲区当中 while((len=in.read(buffer))>0){ //输出缓冲区的内容到浏览器,实现文件下载 out.write(buffer, 0, len); } //关闭文件输入流 in.close(); //关闭输出流 out.close(); } catch (Exception e) { e.printStackTrace(); } }
4,出现问题
(1)一开始用的ajax发送的请求
$.ajax({ url:"downFile", type:'post', async:true, data:$("#queryCourseForm").serialize(),//携带查询条件 success:function () { } });
但是响应头正确,数据也正确的传到后台,但是未下载文件
总结(参考:https://www.cnblogs.com/qlqwjy/p/8971207.html):
即使ajax请求到一个controller在跳转到下载的controller上也不能下载,百度了一下总结下原因:发现原来jQuery的ajax回调已经把response的数据傻瓜式的以字符串的方式解析.
5,解决办法
参考:https://www.cnblogs.com/qlqwjy/p/8971207.html
- 第一种:将传条件的以表单提交的方式进行(推荐这种)-----这种方式也可以用来页面跳转
$("#queryCourseForm").attr("action",contextPath+"/downCourses.do");//改变表单的提交地址为下载的地址 $("#queryCourseForm").submit();//提交表单
- 第二种:以window.location.href="xxx"的方式请求下载地址(我用的这一种)
window.location.href=contextPath+"/downCourses.do"