场景描述
上传excel后遍历处理每一行的数据。想在页面上展示进度条,提示目前已经处理到第几条了。
使用XMLHttpRequest2
来发送请求,在程序服务器端设置HttpServletResponse
的响应内容的长度为sheet的中的行数,然后每处理完一行数据使用getWriter().write()
方法往前台发送一个字符,然后使用flushBuffer()
刷新,按理来说会触发XMLHttpRequest2
的onprogress
事件。
但是实际测试下来在firefox
上是会触发onprogress
事件,会在控制台上 打印进度数据;但是在360浏览器
(急速模式) 和谷歌浏览器
上就只有请求结束的时候才会触发一次,此时的event.loaded
直接等于event.total
了。
这个是和浏览器的内核有关吗?
关键代码
var xhr=new XMLHttpRequest();
var form =new FormData();
form.append("file",$file) ;
xhr.open('POST','.....(请求路由)',true);
xhr.onprogress=function(event){
if (event.lengthComputable) {
var pro = event.loaded/event.total;
console.log(pro);
//progress.css('width', pro*100 + '%');
}
};
xhr.onreadystatechange=function(){
console.log("状态码:"+xhr.readyState);
};
xhr.send(form);
....(获取行数)
response.setContentLength(length);//设置往客户端传输数据长度为总行数
response.setContentType("text/plain");
response.setHeader("Connection","Keep-Alive");
....(遍历每一行)
response.getWriter().write(".");//往客户端传输一个长度的字符
response.flushBuffer();
//按理来说到这一步就会触发onprogress事件了
....(全部遍历结束后)
response.getWriter().close();
看文档,好像设置进度条要在open之前,你改变下顺序试试
我把onprogress事件放在open之前也不行...