因为想要实现下载的文件能够进行选择,而不是经过<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