由于想要实现下载的文件可以进行选择,而不是通过<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/");

这只是我的一些个人看法,如果有不同的看法欢迎探讨。

原文地址:https://www.cnblogs.com/wyhluckdog/p/10741035.html