由於想要實現下載的文件可以進行選擇,而不是通過<a>標簽寫死下載文件的參數,所以一直想要使用JFinal結合ajax實現文件下載,但是ajax實現的文件下載並不能觸發瀏覽器的下載文件彈出框,這裏通過模擬表單提交實現同樣的效果。
由於想要實現下載的文件可以進行選擇,而不是通過<a>標簽寫死下載文件的參數,所以一直想要使用JFinal結合ajax實現文件下載(這樣的話ajax可以傳遞不同的參數),但是ajax實現的文件下載並不能觸發瀏覽器的下載文件彈出框,這裏通過模擬表單提交實現同樣的效果。
1.html代碼:
<a class="mini-button" iconCls="icon-edit" onclick="output()">導出</a>
2.JQuery代碼:
<script type="text/javascript"> mini.parse();var grid = mini.get("datagrid1"); grid.load(); grid.sortBy("createtime", "desc"); function output() { var rows = grid.getSelecteds(); if (rows.length > 0) { if (confirm("確定導出選中記錄?")) { var ids = [];for (var i = 0, l = rows.length; i < l; i++) { var r = rows[i]; ids.push(r.id); } var id = ids.join(‘,‘); grid.loading("操作中,請稍後......"); //=====================================================//模擬表單提交同步方式下載文件,能夠彈出保存文件對話框 var url="/admin/xtsjgl/xtsjgl/outputXtsj"; var form=form = $("<form></form>").attr("action", url).attr("method", "post"); form.append($("<input></input>").attr("type", "hidden").attr("name", "data").attr("value", id)); form.appendTo(‘body‘).submit().remove();
//======================================================= grid.reload(); } } else { alert("請選中一條記錄"); } }
標出的代碼就是通過在JQuery中模擬表單同步方式提交,可以觸發瀏覽器的下載文件彈出框。這樣可以動態設定訪問的controller函數以及向後臺傳的下載文件的參數信息。我這裏的代碼是獲取選中記錄的id,將id值傳到後臺,後臺在根據id查找文件所在的路徑,進行下載。
3.後臺contoller代碼
//導出協同數據記錄 public void outputXtsj() { // 上傳的基本路徑 String baseUploadPath = BaseConfig.baseUploadPath; //renderFile("201903310213.xls"); String data = getPara("data"); System.out.println("導出記錄的id:"+data); String[] ids=data.split(","); for(int i=0;i<ids.length;i++) { int id=Integer.parseInt(ids[i]); //數據文件名 String sjfile=xtsjglService.outputXtsj(id); // 在存儲目錄下找到需要下載的文件 String sjfilePath = "WebContent/" + baseUploadPath + "xtfile/" + sjfile; System.out.println("文件存在的路徑" + sjfilePath); File file = new File(sjfilePath); Boolean sjfileDel = false; System.out.println("文件是否存在:"+file.exists()); if (file.exists()) { System.out.println("文件下載執行了"); renderFile(file); } } //renderNull(); }
JFinal框架只需要一句話就可以實現文件的下載:renderFile(File file)。找到需要下載的文件,如果文件存在則進行下載。
關於JFinal文件下載的一些說明:
JFinal下載的文件不一定要求在me.setBaseDownloadPath("download/");配置的下載文件路徑下,只要是能夠在其他路徑下找找到的文件均可以實現下載,所以也就是說如果我們想要下載的文件不再配置的路徑下就要查找到文件的完整路徑然後在進行下載,如果下載文件在配置的路徑下,只用寫下載文件的文件名就可以實現下載。另一方面也說明了不一定非要在config中配置下載路徑,也就是寫這句話:me.setBaseDownloadPath("download/");
這只是我的一些個人看法,如果有不同的看法歡迎探討。
由於想要實現下載的文件可以進行選擇,而不是通過<a>標簽寫死下載文件的參數,所以一直想要使用JFinal結合ajax實現文件下載,但是ajax實現的文件下載並不能觸發瀏覽器的下載文件彈出框,這裏通過模擬表單提交實現同樣的效果。