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"