php+ajax实现带进度条的大数据排队导出思路以及源码

废话不多说,先上效果图:

点击导出,实现

点击导出

统计完成之后

点击确定

下面来谈谈实现的思路:

前面导出操作简单,从第二个导出操作开始:

点击"确定"调用exportCsv函数

代码如下:

<a class="on" href="javascript:exportCsv();"><em>导出</em></a>

exportCvs函数如下
function exportCsv()
{

 //清除等待的转动圈
    $('#loading').html('');

//弹出统计总数对话框,函数在后面给出定义
    tip();

//ajax请求总数
    $.post("<?php echo WEB_URL;?>/index.php?q=onlinesea/getwherecount"+search_uri, function(json){
        var return_arr = eval('(' + json + ')');
        var num = return_arr['total'];
        var processnum = return_arr['processnum'];

if(num == 0){
            poptip.title('系统消息');
            poptip.content('查询结果为空,不能进行数据导出');
        }
        else
        {
            poptip.close();

for (var i in return_arr['cntarr']){
                if (return_arr['cntarr'][i] != 0){
                    count_arr[i] = return_arr['cntarr'][i];
                }

}
            var ii=0;
            for (var i in count_arr){
                  type_arr[ii]=i;
                  ii++;
            }

  //当数据不为空的时候弹出是否到处框
            exportCsvConfirm(num, processnum);
        }
    });
}

//弹出确认下载  exportCsvConfirm函数

function exportCsvConfirm(num, processnum)
{
    var msg = '需要导出的数据有 <span style="color: red">' + num + '</span> 行,可能会占用您较多时间来进行导出。<br />您还需要继续吗?';

// 提示是否继续
    $.dialog.confirm(msg, function () {
        $('#loading').html('');
        processed_count = 0;
        index = 1;
        win.$('#process_bg').hide().width('0%').show();
        win.$('#process_num').html('0');

$.dialog.through({
            title: '数据导出进度',
            content: win.document.getElementById('processbar'),
            lock: true,
            opacity: '.1'
        },
        function(){
                window.location.reload();
        });
       //当继续的时候
        win.$('#progress_info').show().text('正在导出数据,请耐心等待,请勿关闭窗口...');
      //开始执行导出操作
        excel_export2(num, processnum);
    });
}

关键函数excel_export2队列请求,首先会在前面定义全局变量

代码如下:

var search_uri = "<?php echo $uri;?>";
var event = "<?php echo $event;?>";
var processed_count = 0;    // 已处理的数据条数
var index = 1;
var iii   = 0;
var ajaxmark = 1;
var win = $.dialog.parent;    // 顶层页面window对象
var count_arr = new Array(<?php echo count($this->tables);?>);
var type_arr = new Array();

我们要定义全局变量  index   和iii ,ajaxmark  ,index主要用于对一个表数据太多的时候进行分批导出 ,iii用来控制队列循环,ajaxmark用来判断前一个请求是否执行成功了,成功的话在执行下面的请求

代码如下:

function excel_export2(num, processnum){
      //获取tabletype
      tabletype=type_arr[iii];

//获取总数
      num = count_arr[tabletype];

//判断是否数组是否执行完毕
      if(typeof(tabletype)=='undefined'&&typeof(num)=='undefined'){
            return false;
      }

//判断是否有上一个ajax请求是否完成
      if(ajaxmark==1){

index = 1;
           //将ajax请求标记为未执行完成

    ajaxmark=2;

//执行ajax请求,函数在后面给出
            retrun_var = excel_export_ajax(index, num, processnum, tabletype);
            //判断函数返回
            if(typeof(retrun_var)=='undefined'){

      //将iii自增,执行下一个数组数据
                  iii++;

      //递归调用自己
                  excel_export2(num, processnum);
                  if(iii>100){
                        return false;
                  }

    //当ajax返回成功的时候,返回。
            }else if(retrun_var=='success'){
                  return false;
            }
            return false;
      }else{
            //setTimeout(excel_export2(num, processnum),3000);
            //setInterval(_excel_export2(num, processnum),3000);

    //每隔3秒检查是否ajax请求结束,这里settimeout 不能传递参数,只能通过_excel_export2这种形式
            setTimeout(_excel_export2(num, processnum),3000);
      }
}

function _excel_export2(num, processnum){
       return function(){
             excel_export2(num, processnum);
       }
}

//excel_export_ajax函数  执行导出
/* AJAX,递归调用 */
function excel_export_ajax(index, num, processnum, tabletype)
{
    $.ajax({
        url: "<?php echo WEB_URL;?>/index.php?q=onlinesea/exportcsv"+search_uri+"/index/"+index+ "/total/" + num + '/tabletype/' + tabletype,
        type: 'GET',
        success: function(data)
        {

    //执行次数自增
            ++processed_count;

    //当一个表数据太多,分批导出
            ++index;
            // 更新进度条
    //判断进度
            var process_num = parseInt((processed_count / processnum) * 100);
    
            if (process_num >= 100)
            {
                process_num = 100;
            }

    //跟新进度条
            update_process(process_num);
            //alert(processed_count+'--'+processnum);

    //当执行结束
            if (processed_count >= processnum)
            {

      //压缩文件
                backup_compress();

return 'success';
            }
            if (data == '0'){

      //将ajax请求标记为执行完毕,执行下一个url请求
                ajaxmark=1;
                return false;
            }
            当一个表的数据未导出完成的时候,会循环调用自己去请求, php函数或判断是否到处完成,导出完成返回0  ,未完成返回1
            excel_export_ajax(index, num, processnum, tabletype);
        }
    });
}

/* 备份文件执行压缩 */
function backup_compress()
{
    win.$('#progress_info').text('正在生成压缩文件...');

$.ajax({
        url: "<?php echo WEB_URL;?>/index.php?q=onlinesea/compress/event/<?php echo $event;?>",
        success: function(msg){
            win.$('#process_bg').show().width('100%');
            win.$('#process_num').html('100');
            win.$('#progress_info').html('导出数据完成。  <a href="' + msg + '" style="color: #006699; text-decoration: underline">下载文件</a>');
        }
    });
}

/* 更新进度条 */
function update_process(process_num)
{
    win.$('#process_bg').show().width(process_num + '%');
    win.$('#process_num').html(process_num);
}

下面附上源码,咳咳相关php程序大家自己脑补下吧

代码如下:

<script type="text/javascript" language="javascript">
var search_uri = "<?php echo $uri;?>";
var event = "<?php echo $event;?>";
var processed_count = 0;    // 已处理的数据条数
var index = 1;
var iii   = 0;
var ajaxmark = 1;
var win = $.dialog.parent;    // 顶层页面window对象
var count_arr = new Array(<?php echo count($this->tables);?>);
var type_arr = new Array();
function exportCsv()
{
    $('#loading').html('');
    tip();
    $.post("<?php echo WEB_URL;?>/index.php?q=onlinesea/getwherecount"+search_uri, function(json){
        var return_arr = eval('(' + json + ')');
        var num = return_arr['total'];
        var processnum = return_arr['processnum'];

if(num == 0){
            poptip.title('系统消息');
            poptip.content('查询结果为空,不能进行数据导出');
        }
        else
        {
            poptip.close();

for (var i in return_arr['cntarr']){
                if (return_arr['cntarr'][i] != 0){
                    count_arr[i] = return_arr['cntarr'][i];
                }

}
            var ii=0;
            for (var i in count_arr){
                  type_arr[ii]=i;
                  ii++;
            }
            exportCsvConfirm(num, processnum);
        }
    });
}

function exportCsvConfirm(num, processnum)
{
    var msg = '需要导出的数据有 <span style="color: red">' + num + '</span> 行,可能会占用您较多时间来进行导出。<br />您还需要继续吗?';
    $.dialog.confirm(msg, function () {
        $('#loading').html('');
        processed_count = 0;
        index = 1;
        win.$('#process_bg').hide().width('0%').show();
        win.$('#process_num').html('0');

$.dialog.through({
            title: '数据导出进度',
            content: win.document.getElementById('processbar'),
            lock: true,
            opacity: '.1'
        },
        function(){
                window.location.reload();
        });

win.$('#progress_info').show().text('正在导出数据,请耐心等待,请勿关闭窗口...');

excel_export2(num, processnum);
    });
}

function excel_export2(num, processnum){

tabletype=type_arr[iii];
      num = count_arr[tabletype];
      if(typeof(tabletype)=='undefined'&&typeof(num)=='undefined'){
            return false;
      }
      if(ajaxmark==1){

index = 1;
            ajaxmark=2;
            retrun_var = excel_export_ajax(index, num, processnum, tabletype);

if(typeof(retrun_var)=='undefined'){           
                  iii++;
                  excel_export2(num, processnum);
                  if(iii>100){
                        return false;
                  }
            }else if(retrun_var=='success'){
                  return false;
            }
            return false;
      }else{
            //setTimeout(excel_export2(num, processnum),3000);
            //setInterval(_excel_export2(num, processnum),3000);
            setTimeout(_excel_export2(num, processnum),3000);
      }
}
function _excel_export2(num, processnum){
       return function(){
             excel_export2(num, processnum);
       }
}
/* 执行导出 */
function excel_export(num, processnum){
    var retrun_var = 'ss';
    for (var i in count_arr){
        num = count_arr[i];
        tabletype = i;
        index = 1;
        retrun_var = excel_export_ajax(index, num, processnum, tabletype);

if(typeof(retrun_var)=='undefined'){
            //alert('xxxx');
            setTimeout(function(){exit;},5000);
        }
        if (retrun_var == 'success')
        {
            return false;
        }
    }

return false;
}

/* AJAX,递归调用 */
function excel_export_ajax(index, num, processnum, tabletype)
{
    $.ajax({
        url: "<?php echo WEB_URL;?>/index.php?q=onlinesea/exportcsv"+search_uri+"/index/"+index+ "/total/" + num + '/tabletype/' + tabletype,
        type: 'GET',
        success: function(data)
        {
            ++processed_count;
            ++index;
            // 更新进度条

var process_num = parseInt((processed_count / processnum) * 100);

if (process_num >= 100)
            {
                process_num = 100;
            }
            update_process(process_num);
            //alert(processed_count+'--'+processnum);
            if (processed_count >= processnum)
            {
                backup_compress();

return 'success';
            }
            if (data == '0'){
                ajaxmark=1;
                return false;
            }

excel_export_ajax(index, num, processnum, tabletype);
        }
    });
}

/* 更新进度条 */
function update_process(process_num)
{
    win.$('#process_bg').show().width(process_num + '%');
    win.$('#process_num').html(process_num);
}

/* 备份文件执行压缩 */
function backup_compress()
{
    win.$('#progress_info').text('正在生成压缩文件...');

$.ajax({
        url: "<?php echo WEB_URL;?>/index.php?q=onlinesea/compress/event/<?php echo $event;?>",
        success: function(msg){
            win.$('#process_bg').show().width('100%');
            win.$('#process_num').html('100');
            win.$('#progress_info').html('导出数据完成。  <a href="' + msg + '" style="color: #006699; text-decoration: underline">下载文件</a>');
        }
    });
}
function tip()
{
    poptip = $.dialog.through({
        id: 'tip',
        title: '系统消息',
        content: '正在统计总数,请勿关闭窗口  <img src="http://images.cnblogs.com/loading_s.gif" />',
        width: 300,
        height: 100,
        icon: 'system',
        lock: true,
        opacity: .1
    },
    function(){
        window.location.reload();
    });

poptip.show();
}

function packetDelete(url,msg)
{
    $.dialog.confirm(msg, function () {
        $.post(url, function(data){
          if(data == '1'){
              $.dialog('删除成功', function(){window.location.reload();});
          }
          else if(data == '2'){
            $.dialog('删除失败', function(){window.location.reload();});
          }
          else if(data == '3'){
            $.dialog('文件不存在,或者已删除', function(){window.location.reload();});
          }
      });
     });
}
</script>

(0)

相关推荐

  • PHP中使用Session配合Javascript实现文件上传进度条功能

    Web应用中常需要提供文件上传的功能.典型的场景包括用户头像上传.相册图片上传等.当需要上传的文件比较大的时候,提供一个显示上传进度的进度条就很有必要了. 在PHP 5.4以前,实现这样的进度条并不容易,主要有三种方法: 1.使用Flash, Java, ActiveX 2.使用PHP的APC扩展 3.使用HTML5的File API 第一种方法依赖第三方的浏览器插件,通用性不足,且易带来安全隐患.不过由于Flash的使用比较广泛,因此还是有很多网站使用Flash作为解决方案. 第二种方法的不足

  • PHP+FLASH实现上传文件进度条相关文件 下载

    PHP之所以很难实现上传进度条是因为在我们上传文件到服务器的时候,要等到文件全部送到服务器之后,才执行相应的php文件.在这之前,文件数据保存在一个临时文件里面,而php无法获得这个文件的路径及大小.      从Actionscript 2.0开始,Flash支持文件上传及下载了.虽然不能在服务端获得文件上传进度,但我们可以在服务端获得文件的发送进度.根据这个原理,用Flash就能做出上传进度条效果.      我在网上看到过一些资料,但是感觉有缺陷.于是自己研究了一下,在前人的基础上加强了程

  • php 进度条实现代码

    复制代码 代码如下: <html> <head> </head> <body> <table width="400" border="0" cellspacing="1" cellpadding="1"> <tr> <td bgcolor="000000"> <table width="400" b

  • PHP 进度条函数的简单实例

    PHP 进度条函数的简单实例 其实进度条的做法很简单的.网上的一大堆,自己写了一个,哈哈,感觉看起来很有感觉. 实例代码: function ShowPercent($now,$total) { $percent = sprintf('%.0f',$now*100/$total); $html = '<table width="60%" style="border-collapse:separate" height="10" border=

  • PHP 文件上传进度条的两种实现方法的代码

    目前我知道的方法有两种,一种是使用PHP的创始人 Rasmus Lerdorf 写的APC扩展模块来实现(http://pecl.php.net/package/apc),另外一种方法是使用PECL扩展模块 uploadprogress实现(http://pecl.php.net/package/uploadprogress)我这里举两个分别实现的例子供参考,更灵活的应用根据自己需要来修改. APC实现方法: 安装APC,参照官方文档安装,可以使用PECL模块安装方法快速简捷,这里不说明 配置p

  • PHP实现的进度条效果详解

    本文实例讲述了PHP实现的进度条效果.分享给大家供大家参考,具体如下: 在做采集的时候,想通过php来实现一个进度条功能,谷歌了一下,找了个合适的代码.下面直接上代码: <?php //防止执行超时 set_time_limit(0); //清空并关闭输出缓存 ob_end_clean(); //需要循环的数据 for($i = 0; $i < 188; $i++) { $users[] = 'Tom_' . $i; } //计算数据的长度 $total = count($users); //

  • php+ajax实现带进度条的大数据排队导出思路以及源码

    废话不多说,先上效果图: 点击导出,实现 点击导出 统计完成之后 点击确定 下面来谈谈实现的思路: 前面导出操作简单,从第二个导出操作开始: 点击"确定"调用exportCsv函数 复制代码 代码如下: <a class="on" href="javascript:exportCsv();"><em>导出</em></a> exportCvs函数如下function exportCsv(){ //清

  • php+ajax实现带进度条的上传图片功能【附demo源码下载】

    本文实例讲述了php+ajax实现带进度条的上传图片功能.分享给大家供大家参考,具体如下: 运行效果图如下: 代码如下: <?php if(isset($_FILES["FileInput"]) && $_FILES["FileInput"]["error"]== UPLOAD_ERR_OK) { ############ Edit settings ############## $UploadDirectory = 'F:

  • PHP+Ajax异步带进度条上传文件实例

    最近项目中要做一个带进度条的上传文件的功能,学习了Ajax,使用起来比较方便,将几个方法实现就行. 前端引入文件 <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css"> <script src="http://apps.bdimg.com/libs/jquery/2.1.1/jquery.min

  • PHP+AjaxForm异步带进度条上传文件实例代码

    在使用ajaxForm方法之前,首先需要安装form.js的插件,网上有: 一.首先说用法,ajaxForm可以接收0或1个参数,该参数可以是一个变量.一个对象或回调函数,这个对象主要有以下参数: var object= { url:url, //form提交数据的地址 type:type, //form提交的方式(method:post/get) target:target, //服务器返回的响应数据显示的元素(Id)号 beforeSerialize:function(){} //序列化提交

  • 基于Ajax技术实现文件上传带进度条

    1.概述 在实际的Web应该开发或网站开发过程中,经常需要实现文件上传的功能.在文件上传过程中,经常需要用户进行长时间的等待,为了让用户及时了解上传进度,可以在上传文件的同时,显示文件的上传进度条.运行本实例,如图1所示,访问文件上传页面,单击"浏览"按钮选择要上传的文件,注意文件不能超过50MB,否则系统将给出错误提示.选择完要上传的文件后,单击"提交"按钮,将会上传文件并显示上传进度. 2.技术要点 主要是应用开源的Common-FileUpload组件来实现分

  • PHP+Ajax无刷新带进度条图片上传示例

    项目需求:1.PHP+Ajax无刷新带进度条图片上传,2.带进度条.所需插件:jquery.js,jquery.form.js. 最近在做一个手机web项目,需要用到Ajax上传功图片能,项目要求PHP无刷新上传图片,并且要带进度条,下面就来讲一下我的实现方法,先看效果图 本示例需要使用的是jquery.js,jquery.form.js,demo里面包含有,你可以在文章下方进行下载. 第一步,建立前端页面index.html 此段是前端展示内容,这里需要说明的是由于input:file标签显示

  • PHP大文件切割上传并带进度条功能示例

    本文实例讲述了PHP大文件切割上传并带进度条功能.分享给大家供大家参考,具体如下: 前面一篇介绍了PHP大文件切割上传功能,这里再来进一步讲解PHP大文件切割上传并带进度条功能. 项目结构图: 14-slice-upload-fix.html文件: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible&q

  • PHP实现带进度条的Ajax文件上传功能示例

    本文实例讲述了PHP实现带进度条的Ajax文件上传功能.分享给大家供大家参考,具体如下: 之前分享了一篇关于 php使用FileApi实现Ajax上传文件 的文章,里面的Ajax文件上传是不带进度条的,今天分享一篇关于带进度条的Ajax文件上传文章. 效果图: 项目结构图: 12-progress-upload.html文件: 页面中主要有一个上传文件控件,有文件被选择时响应selfile()方法,接着利用js读取上传文件.创建FormData对象和xhr对象,利用xhr2的新标准,写一个监听上

  • asp.net mvc 实现文件上传带进度条的思路与方法

    前言 文件上传与下载的操作在实际项目中经常是很重要的一个内容,在使用ASP.NET Web Form的时候我们可以使用诸多的服务器控件,FileIpload就是其中之一,但是在ASP.NET不建议使用那些服务器控件,因为那样违反三层架构原则.最近参考网络资料,学习了ASP.NET MVC如何上传文件. 而这篇文章主要重点是asp.net mvc 实现文件上传带进度条,下面来一起看看吧. 实现思路 ajax异步上传文件,且开始上传文件的时候启动轮询来实时获取文件上传进度.保存进度我采用的是memc

  • jQuery上传多张图片带进度条样式(DEMO)

    下面一段代码给大家分享jquery上传多种图片带进度条样式,具体代码如下所示: <!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title>xhr2</title> </head> <body> <div style="text-align: center; margin: 100px"> <

随机推荐