由于想要实现下载的文件可以进行选择,而不是通过<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实现的文件下载并不能触发浏览器的下载文件弹出框,这里通过模拟表单提交实现同样的效果。的更多相关文章

  1. 利用HttpWebRequest模拟表单提交 JQuery 的一个轻量级 Guid 字符串拓展插件. 轻量级Config文件AppSettings节点编辑帮助类

    利用HttpWebRequest模拟表单提交   1 using System; 2 using System.Collections.Specialized; 3 using System.IO; ...

  2. firefox浏览器中 bootstrap 静态弹出框中select下拉框不能弹出(解决方案)

    问题出现场景1: 在firefox浏览器中在bootstrap弹出的modal静态框中再次弹出一个静态框时 select下拉框不能弹出选项 解决方案:去掉最外层静态框的 tabindex=" ...

  3. c# 模拟表单提交,post form 上传文件、大数据内容

    表单提交协议规定:要先将 HTTP 要求的 Content-Type 设为 multipart/form-data,而且要设定一个 boundary 参数,这个参数是由应用程序自行产生,它会用来识别每 ...

  4. c# 模拟表单提交,post form 上传文件、数据内容

    转自:https://www.cnblogs.com/DoNetCShap/p/10696277.html 表单提交协议规定:要先将 HTTP 要求的 Content-Type 设为 multipar ...

  5. ajax模拟表单提交,后台使用npoi实现导入操作 方式二

    页面代码: <form id="form1" enctype="multipart/form-data"> <div style=" ...

  6. ajax模拟表单提交,后台使用npoi实现导入操作 方式一

    页面代码: <form id="form1" enctype="multipart/form-data"> <div style=" ...

  7. 浏览器下载/导出文件 及jQuery表单提交

    1 比如以下按钮, 用于导出文件,如EXCEL文件. <li> <button class="whiteBg btn2" onclick="doExp( ...

  8. Netty学习笔记(一):接收nodejs模拟表单上传的文件

    好久不写博客了,也好久不写代码了,这两天临时遇上一个事情,觉得不难,加上觉得手有些生,就动手做了一下,结果遇上了不少坑,有新坑,有老坑,痛苦无比,现在总算差不多了,赶紧记录下来,希望以后不再重复这种痛 ...

  9. MVC下HtmlHelper自带BeginForm表单提交与异步Ajax请求

    假如有一个数据表格UserInfo: public class UserInfo { public int Id { get; set; } public string Name { get; set ...

随机推荐

  1. java基础总结001

    1     sdf.parse()和sdf.format()它们两者的用法   http://www.imooc.com/wenda/detail/324671 3     Java String.s ...

  2. 如何將字串yyyyMMddHHmmss轉成Datetime呢?

    有朋友在FB上問到,他們將日期的分隔符號都置換成空字串後的字串,要如何將它再轉回成DateTime呢? 例如日期 2013/04/02 14:08:37 會轉成 20130402140837 . 要如 ...

  3. WEB前端问题——img标签的onclick事件无法响应问题【转载】

    一个纠结了一下午的问题,img标签里面的onclick事件无法响应.最终找到了错误原因,是因为img标签的id与onclick事件的方法名相同. 于是接着又测试了一下,发现name名和方法名相同也会导 ...

  4. c# vs2013部署项目

    http://demo.netfoucs.com/shinepan/article/details/24865931

  5. C++ MFC 改变控件大小和位置

    用CWnd类的函数MoveWindow()或SetWindowPos()可以改变控件的大小和位置. void MoveWindow(int x,int y,int nWidth,int nHeight ...

  6. How to fix the bug “Expected "required", "optional", or "repeated".”?

    参考:https://github.com/tensorflow/models/issues/1834 You need to download protoc version 3.3 (already ...

  7. array_column 低版本兼容

    function i_array_column($input, $columnKey, $indexKey=null){ if(!function_exists('array_column')){ $ ...

  8. mysql ERROR 1819 (HY000): Your password does not satisfy the current policy requirements

    为了加强安全性,MySQL5.7为root用户随机生成了一个密码,在error log中,关于error log的位置,如果安装的是RPM包,则默认是/var/log/mysqld.log. 一般可通 ...

  9. select字符串

    [select字符串] select通常用于选择某中的某一列.如有表Download: 通常用select选择某一列,如: 当select一个字符串时,则会返回如下值: 结论:select中传递一个字 ...

  10. Mybatis批量更新和插入

    <update id="updateOrInsert"> <foreach collection="list" index="ind ...