总体的思路:
是在点击导出按钮时获得一个时间戳并把时间戳填充到form表单中发送给后台,后台响应成功后把发送的时间戳设置为cookie值,前端实时监测cookie值和前端的时间戳是否相等,相等就说明文件导出成功,提示导出结果。
难点:流写入到浏览器中,但是没有办法判断浏览器什么时候下载完成。
具体看代码实现:
前端表单提交提交date
var date=new Date().getTime();//获取时间
html.push('<input type="text" name="date" value="'+date+'" />');//添加到表单
$('#exportForm').submit().remove();//表单提交
后端导出方法时候,加入一段添加cookie的逻辑:
response.setHeader("Content-type", "text/html;charset=UTF-8");
response.setContentType("application/vnd.ms-excel");
Cookie cookie = new Cookie("D" + date, date + "," + size);//将时间戳设置到cookie中
cookie.setMaxAge(20000);//设置cookie生存时间,可调小一点
response.addCookie(cookie);//添加cookie
前端加一段轮询代码:
var time = setInterval(function () {//定时器检测cookie ,通过cookie updateStatus 的值判断下载是否完成
var ck = getCookies("D"+date);//getCookies()方法是根据论坛资料自己搜索后写的,感谢csdn和提供资料的前辈,具体忘了哪位提供的啦。。。
if (ck.split(",")[0] == date) //值为success时,即为下载(到本地)完成了。
{
if(ck.split(",")[1] <= 40000){
jAlert("导出成功"+ck.split(",")[1]+"行<br />导出最大支持40000行");
}else{
jAlert("导出成功40000行<br />导出最大支持40000行");
}
clearInterval(time);//清理定时器。
}
}, "1000") //每秒运行1次。
轮询代码的函数getCookie:
function getCookies(cookieKey) {
var cookies = document.cookie.split(';');//把cookie分开为[]。
for (var i = 0; i < cookies.length; i++)//遍历cookie[]。
{
var keyValues = cookies[i].split('='); //cookie是字符串形式的name1=value1通过分号';'联合起来的,
if (cookieKey == keyValues[0].trim()) //第0个(第一个)是key
{
return unescape(keyValues[1]).replace("\"","").replace("\"",""); //返回想要的key对应的value(key:value形式键值对)。
}
}
return null;//没有想要的值,返回null。
}
来源:CSDN
作者:魔方方方程程
链接:https://blog.csdn.net/admin123fy/article/details/104778516