在网页下载文件时,该文件又是通过后台代码生成的,比如报表之类的。当需要生成文件过大时会耗费很多时间,而文件生成好传到页面的时候也没有事件可以监听它,像微软官网,谷歌,百度等下载方式都是通过提示五秒过后开始下载,如未下载点击链接的方式,可以去idea官网下载idea看效果。但这种下载文件都是预先就有的,所以很快就能开始下载。当生成报表就需要几分钟当时候这个时间就不能接受了,目前也没有特别有效当方法进行监听下载开始当事件。另辟蹊径利用cookie模拟下载完成事件。

  前端代码如下:

var url=""
var iframe=document.createElement("iframe");
iframe.src=url;
$(iframe).css("display","none");
//显示等待提示
showMask();
var downId=new Date().getTime();//以时间戳来区分每次下载
document.body.appendChild(iframe)
var interval=setInterval(function(){
var down=getCookie("D"+downId);
if(down==downId){
//隐藏等待提示,下载完成
hideMask();
. $(iframe).remove();
}
},1000);

java代码如下:

String downTime=request.getParameter("downId");//获取下载的时间戳
Cookie cookie=new Cookie("D"+downTime,downTime);//将时间戳设置到cookie中
cookie.setMaxAge(20000);//设置cookie生存时间,可调小一点
response.addCookie(cookie);//添加cookie

  在前端首先要有个获取cookie的方法,可参考获取浏览器cookie。后台在报表生成完成准备将文件流导入进response之前将下载时的时间戳设置到cookie中,

然后在前台循环读取当前下载的时间戳,当读到这个时间戳时代表后台报表已经生成完成,即将开始下载。注意生存时间不能过短,最少要三个循环时间,可设置长一点,也不宜过长,不然下载太多会造成cookie超长。

  这个方法是利用浏览器当cookie来侧面判断下载当时间。当浏览器禁用当cookie这个效果就不能实现来。还可以通过数据库来实现,原理和cookie当方式类似,只不过把标志存储到数据库来。在前端利用websocket或者轮询等方式从数据库读取标志。

最新文章

  1. linux @后面的主机名如何修改
  2. Magento显示多货币,Magento 多货币设置
  3. Unity3D引擎扩展中的编辑器定制方法
  4. JavaScript的作用域和闭包
  5. BZOJ 1565 植物大战僵尸(最大权闭合图)
  6. Children's Day
  7. 关于Redis的一些常识
  8. servlet & javabean
  9. python 全栈开发,Day112(内容回顾,单例模式,路由系统,stark组件)
  10. MongoDB 用户管理
  11. ActiveX 控件
  12. 安装php_sqlsrv扩展
  13. sqlserver 数据分发复制 发布订阅
  14. 【转】VISUAL STUDIO 2008代码指标为您节省资金
  15. ethereum & ETC
  16. MAC下安装Homebrew 和 @权限的问题
  17. 安装好php后找不到php.ini
  18. 使用Python调用动态库
  19. 跑对抗样本库 CleverHans 的例子时,遇到的问题
  20. upload-labs19记录

热门文章

  1. 取/etc/password文件最后一个单词的最后一个字符
  2. Python爬虫4------图片爬虫
  3. struct timeval和gettimeofday
  4. Hibernate 的核心配置文件
  5. Centos6下创建Centos6基础镜像
  6. sax解析xml文件的DefaultHandler处理类
  7. 关于python从Oracle中读取数据中文全是问号的问题
  8. applicationContext-redis.xml
  9. solrj 操作 solr 单机版
  10. mybatis入门截图四(订单商品数据模型-懒加载-缓存)