因爲想要實現下載的文件能夠進行選擇,而不是經過<a>標籤寫死下載文件的參數,因此一直想要使用JFinal結合ajax實現文件下載(這樣的話ajax能夠傳遞不一樣的參數),可是ajax實現的文件下載並不能觸發瀏覽器的下載文件彈出框,這裏經過模擬表單提交實現一樣的效果。javascript
1.html代碼:html
<a class="mini-button" iconCls="icon-edit" onclick="output()">導出</a>
2.JQuery代碼:java
<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查找文件所在的路徑,進行下載。ajax
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)。找到須要下載的文件,若是文件存在則進行下載。app
關於JFinal文件下載的一些說明:框架
JFinal下載的文件不必定要求在me.setBaseDownloadPath("download/");配置的下載文件路徑下,只要是可以在其餘路徑下找找到的文件都可以實現下載,因此也就是說若是咱們想要下載的文件再也不配置的路徑下就要查找到文件的完整路徑而後在進行下載,若是下載文件在配置的路徑下,只用寫下載文件的文件名就能夠實現下載。另外一方面也說明了不必定非要在config中配置下載路徑,也就是寫這句話:me.setBaseDownloadPath("download/");函數
這只是個人一些我的見解,若是有不一樣的見解歡迎探討。post