本文要解决两个问题:
1、在ajax的数据交互中,如何获得后台的处理进度?
2、在前台界面中,如何使用图形化的方式展示后台处理进度?
 
关于第一个问题,不是本文的重点,简单说一下思路。因为HTTP协议实际上是无状态的协议,前台的请求提交给后台之后,一般情况下都是后台处理完成才会向前台返回处理结果。如果想前台展示处理进度,有三个方法:
一、使用flush()函数。PHP中提供了 flush() 和 ob_flush() 函数,允许用户将缓存的内容输出,但是如果在服务器端使用了gzip压缩,这种方法常常会失效。另外,这种办法实际上是一个流式的结果输出,在形式上很难有美观的展现。
二、使用JS控制任务进度。更好的办法我觉得应该是使用JS在前端来控制多个任务提交的顺序,从而在前端计算整体的进度来用图形化的方式展现。
三、后台实现进度记录,前台进行展现。也可以采用后端使用持久化数据来记录整体计划于当前进度,前端JS定时异步调用查询结果的方式来实现前端的展示。我在一个Zip文件包解压并处理的程序中采用了第二种方式,大家可以根据项目的具体情况来选用。
 
下面来说如何用 Fusion charts 实时展现后台进度,本文只实现简单的有一个任务进度展示的情况。实际上 Linear Gauge 非常强大,可以支持多个指示标志,本文就不做考虑,只考虑实现一个简单的进度指示标志的情况。
 
完成后的效果如下图,用户选择一个Zip文件包进行上传,JS完成后台上传、解压缩与文件处理的操作。使用FusionCharts进行图形化的进度显示。
 
其中文件上传使用了jQuery的AjaxUpload插件,文件上传部分的JS代码如下:
 
      $('#userfile').AjaxFileUpload({
action: '/tool/uploadZip',
onChange: function(filename){
//console.log("Change");
$('#tip_text').text("正在上传");
interval = window.setInterval(function() {
var text = $("#tip_text").text();
if (text.length < 13) {
$('#tip_text').text(text + ".");
} else {
$('#tip_text').text("正在上传");
} $.cookie('progress', 20);
}, 200);
//$("#tip_text").append("文件上传开始");
},
// secureuri: false,
// fileElementId:'test',
onSubmit: function(filename) {
return true;
},
onComplete: function(filename, response) {
window.clearInterval(interval); $("#file_count").html( response.zip_info.file_list.length );
$("#tip_text").append("<br />文件上传完成,即将开始进行导入");
$.cookie('progress', 40); zip_import(response, 0, response.zip_info.file_list.length);
}
});

文件上传后,使用JS记录下上传的文件以及Zip包内文件的数量,然后开始使用JS控制逐个文件的提交。这一部分处理的难点主要在于Zip的解压和进度控制。Zip的解压有PHP的ZipArchive类,可以很方便的获取Zip内的文件列表,以及指定读取某个文件。当获取了Zip文件包的列表数量之后,我就可以在前台使用JS控制逐个文件的读取。

 
最后就是整个过程的图形化界面显示,FusionCharts部分的代码如下:
 
      FusionCharts.ready(function(){
var fusioncharts = new FusionCharts({
type: 'hlineargauge',
renderAt: 'realchart',
id: 'realtime-chart',
width: '400',
height: '170',
dataFormat: 'json',
dataSource: {
"chart": {
"theme": "fint",
"caption": "后台处理进度",
"subcaption": "www.dcod.com",
"lowerLimit": "0",
"upperLimit": "100",
"numberSuffix": "%",
"chartBottomMargin": "40",
"valueFontSize": "11",
"valueFontBold": "0"
},
"colorRange": {
"color": [{
"minValue": "0",
"maxValue": "35",
"label": "文件上传",
}, {
"minValue": "35",
"maxValue": "100",
"label": "解压与保存",
}]
},
"pointers": {
"pointer": [{
"value": "0"
}]
},
"trendPoints": {
"point": [
//Trendpoint
{
"startValue": "70",
"displayValue": " ",
"dashed": "1",
"showValues": "0"
}, {
"startValue": "85",
"displayValue": " ",
"dashed": "1",
"showValues": "0"
},
//Trendzone
{
"startValue": "70",
"endValue": "85",
"displayValue": " ",
"alpha": "40"
}
]
}
},
"events": {
"rendered":function(evtObj, argObj){
evtObj.sender.intervalVar = setInterval(function(){
console.log("Txt x");
//定时获取服务端的数据
var prcnt = $.cookie('progress'); //将数据提交给图表
FusionCharts.items["realtime-chart"].feedData("value=" + prcnt);
}, 5000);
},
"disposed":function(evtObj, argObj){
console.log('disposed');
clearInterval(evtObj.sender.intervalVar);
}
}
}
); fusioncharts.render();
});

FusionCharts设置了一个轮训间隔,不断地从后台查询数据。因为我的后台处理过程都是在领带的ajax请求中完成的,所以采取了一个折衷的办法,ajax请求完成后,将进度写入到cookie中,然后FusionCharts定时从cookie中读取进度来进行展示。

 
注:我使用的版本是Fusion Charts Suite XT
 
参考资料:
2、AjaxFileUpload

使用Fusioncharts实现后台处理进度的前台展示的更多相关文章

  1. ASP.NET CORE使用WebUploader对大文件分片上传,并通过ASP.NET CORE SignalR实时反馈后台处理进度给前端展示

    本次,我们来实现一个单个大文件上传,并且把后台对上传文件的处理进度通过ASP.NET CORE SignalR反馈给前端展示,比如上传一个大的zip压缩包文件,后台进行解压缩,并且对压缩包中的文件进行 ...

  2. jsp实时显示后台批处理进度 - out分块,简单的长连接方式

    这两天在实现一个批处理操作,但是想让前台实时显示后台批处理进度,本想着用复杂一些的框架可以实现异步信息调用 但是鉴于是内部管理系统,且只有一两个人用到这个功能,所以做了一个简单的长连接方式的实时响应 ...

  3. Web页面实现后台数据处理进度与剩余时间的显示

    1.页面后台代码添加如下属性: /// <summary> /// 总数 /// </summary> private double total { set { Session ...

  4. Asp.Net MVC页面显示后台处理进度问题

    这个问题的背景是,用户通过浏览器上传文件或Excel数据到系统中,页面需要时时显示后台处理进度,以增强用户的体验. 在GitHub上找到一个一个项目,基本实现了这个功能,具体效果如下图 代码实现过程大 ...

  5. 前台的js对象数组传到后台处理。在前台把js对象数组转化为json字符串,在后台把json字符串解析为List<>

    前台的js对象数组传到后台处理.在前台把js对象数组转化为json字符串,在后台把json字符串解析为List<>

  6. spring boot 解决后台返回 json 到前台中文乱码之后出现返回json数据报错 500:no convertter for return value of type

    问题描述 spring Boot 中文返回给浏览器乱码 解析成问号?? fastJson jackJson spring boot 新增配置解决后台返回 json 到前台中文乱码之后,出现返回json ...

  7. 【spring mvc】后台API查询接口,get请求,后台Date字段接收前台String类型的时间,报错default message [Failed to convert property value of type 'java.lang.String' to required type 'java.util.Date' for property 'createDate';

    后台API查询接口,get请求,后台Date字段接收前台String类型的时间筛选条件 后台接口接收 使用的实体 而createDate字段在后台实体中是Date类型 报错信息: org.spring ...

  8. laydate控件后台返回的时间前台格式化

    //功能:laydate控件后台返回的时间前台格式化 //参数:laydate控件值 function formatDate(strTime) { if ("" === strTi ...

  9. java后台获取和js拼接展示信息

    java后台获取和js拼接展示信息: html页面代码: <div class="results-bd"> <table id="activityInf ...

随机推荐

  1. Android 基于Android的手机邮件收发(JavaMail)之四(邮件的发送)

    上一个邮件的接受,因为不当操作,保存未完成,一切东西都得从头开始那就先从邮件发送来吧. 先下我们做一个较为简单的邮件发送 以下是源代码:相信看过上篇文章所给连接的人,对于javamail应该都有了一定 ...

  2. Python之路----------基础 一(数据类型、变量、基本语法、流程控制)

    一. 数据类型与变量 1.数据类型 整数   #Python在程序中的表示方法和数学上的写法一模一样,-1,0,1都是整数. 浮点数  1 #浮点数就是小数. 字符串 1 #在Python中字符串是以 ...

  3. VR原理讲解及开发入门

    本文是作者obuil根据多年心得专门为想要入门的VR开发者所写,由52VR网站提供支持.   1. VR沉浸感和交互作用产生的原理:   在之前,我们观看一个虚拟的创造内容是通过平面显示器的,52VR ...

  4. Leetcode: Sequence Reconstruction

    Check whether the original sequence org can be uniquely reconstructed from the sequences in seqs. Th ...

  5. linux------------Another app is currently holding the xtables lock. Perhaps you want to use the -w option?

    今天突然遇到这个么一个奇葩的问题,直接说问题的原因:原因是我们创建了一个计划任务,这个计划任务是一分钟执行一次,是iptables封ip的一个sh脚本.由于攻击我们的ip太多,已经达到了几千个,这个脚 ...

  6. XPath、XQuery 以及 XSLT 函数

    存取函数 名称 说明 fn:node-name(node) 返回参数节点的节点名称. fn:nilled(node) 返回是否拒绝参数节点的布尔值. fn:data(item.item,...) 接受 ...

  7. OpenERP 使用与开发笔记(一)

    一直关注OpenERP,但一直未真正使用.最近一些数据想规范管理,免得使和EXCEL与WORD等到处找,所以想到OpenERP的自定义功能比较好,就再次找来相关资料重新拾掇起来.在这过程中,发现了许多 ...

  8. 如何防止sql注入

    注入法: 从理论上说,认证网页中会有型如: select * from admin where username='XXX' and password='YYY' 的语句,若在正式运行此句之前,如果没 ...

  9. Java多线程开发系列之四:玩转多线程(线程的控制1)

    在前文中我们已经学习了:线程的基本情况.如何创建多线程.线程的生命周期.利用已有知识我们已经可以写出如何利用多线程处理大量任务这样简单的程序.但是当应用场景复杂时,我们还需要从管理控制入手,更好的操纵 ...

  10. rqt工具的使用

    安装rqt工具sudo apt-get install ros-indigo-rqtsudo apt-get install ros-indigo-rqt-common-plugins或者rosdep ...