• 技术文章 >后端开发 >php教程

    PHP+apc+ajax实现的ajax_upload上传进度条代码_PHP

    2016-05-28 11:48:56原创428
    本文实例讲述了PHP+apc+ajax实现的ajax_upload上传进度条代码。分享给大家供大家参考,具体如下:

    上传进度条是怎么实现的呢?原理是怎么样的呢?当我们浏览,选择上传后,会产生一个临时文件,上传的时把这个临时文件,上传到服务器,上传完成后,这个临时文件会被删除掉。如果我们能读取这个临时文件的大小,就知道上传进度是多少了,php apc模块可以实现这个功能。

    一、安装apc模块

    下载地址:http://pecl.php.net/package/apc

    tar zxvf APC-3.1.8.tgz
    cd APC-3.1.8/
    /usr/local/php/bin/phpize
    ./configure --with-php-config=/usr/local/php/bin/php-config
    make && make install
    
    

    二、修改php.ini

    extension = apc.so
    apc.rfc1867 = 1
    apc.max_file_size = 200M
    upload_max_filesize = 1000M
    post_max_size = 1000M
    max_execution_time = 600
    max_input_time = 600
    memory_limit = 128M
    
    

    修改好后,重起apache或者其他,查看一下

    [root@BlackGhost php]# php -m
    [PHP Modules]
    apc
    cgi-fcgi
    ctype
    curl
    date
    dom
    eAccelerator
    。。。。。。。。
    
    

    三、upload_test.php

    <?php
    $id = uniqid(rand(), true);
    ?>
    
    
    
    
    
    

    上传测试





    APC_UPLOAD_PROGRESS这个有什么用呢?它对上传的文件添加一个标记,就可以在其它的php程序中用这个标记访问它。为apc的读取提供支持。

    upload.js异步上传的js文件:

    function form_submit (){
    new AjaxUpload('#upload', {
    action: 'upload.php',
    name: 'file',
    data: {
    APC_UPLOAD_PROGRESS:$("#progress_key").val()
    },
    autoSubmit: true,
    onSubmit: function(file, extension){
    $('#progressouter').css('display', 'block');
    progress();
    },
    onComplete: function(file, response){
    $("#showInfo").html(response);
    }
    });
    }
    function progress (){
    $.ajax({
    type: "GET",
    url: "progress.php?progress_key="+$("#progress_key").val(),
    dataType: "json",
    cache:false,
    success: function(data){
    if(data == 0) {
    var precent = 0;
    } else {
    for (i in data) {
    if (i == "current") {
    var json_current = parseInt(data[i]);
    }
    if (i == "total") {
    var json_total = parseInt(data[i]);
    }
    }
    var precent = parseInt(json_current/json_total * 100);
    $("#progressinner").css("width",precent+"%");
    $("#showNum").html(precent+"%");
    $("#showInfo").html("ok");
    }
    if ( precent < 100) {
    setTimeout("progress()", 100);
    }
    }
    });
    }
    
    

    上面有一点要注意,APC_UPLOAD_PROGRESS:$("#progress_key").val()在这里,key是APC_UPLOAD_PROGRESS如果不是这个的话,apc找不到临时文件的。在这里我为什么要用ajax_upload.js呢,因为jquery自带的ajax,自带参数没有上传文件的,也就是type='file'中的内容,php端根本得不到。

    四、upload.php上传文件

    <?php
    if($_SERVER['REQUEST_METHOD'] == 'POST') {
    if(empty($_FILES["file"]["tmp_name"])){
    echo "no file";
    die;
    }
    $tmp_name = $_FILES["file"]["tmp_name"];
    $name = dirname($_SERVER['SCRIPT_FILENAME'])."/upload/".$_FILES["file"]["name"];
    move_uploaded_file($tmp_name, $name);
    echo "

    File uploaded.

    "; } ?>

    如果文件比较大,就不要用http的方式来上传了,太慢,并且影响网站的稳定性。

    五、progress.php取得进度的文件,给ajax调用用的

    <?php
    if(isset($_GET['progress_key'])) {
    $status = apc_fetch('upload_'.$_GET['progress_key']);
    if($status['total']!=0 && !empty($status['total'])) {
    echo json_encode($status);
    } else {
    echo 0;
    }
    }
    ?>
    
    

    看一下,ajax 异步请求产生的数据。

    php apc ajax 上传进度条

    参数说明:

    total 文件大小
    current 已上传的大小
    filename 上传文件名
    name 标签名
    done 上传成功为1
    cancel_upload 用户取消上传,只有上传完成时才有
    rate 上传速度,只有上传完成时才有
    start_time 开始时间

    更多关于PHP文件及ajax操作相关内容感兴趣的读者可查看本站专题:《php文件操作总结》及《PHP+ajax技巧与应用小结》

    希望本文所述对大家PHP程序设计有所帮助。

    声明:本文原创发布php中文网,转载请注明出处,感谢您的尊重!如有疑问,请联系admin@php.cn处理
    专题推荐:PHP apc ajax ajax_upload 上传
    上一篇:php实现word转html的方法_PHP 下一篇:php结合md5实现的加密解密方法_PHP
    大前端线上培训班

    相关文章推荐

    • 你必须了解PHP中什么是抽象类和抽象方法• PHP中怎样完成Cookie的创建、读取和删除?• 五分钟带你看PHP中的接口interface声明与应用(实例详解)• PHP中怎样去判断对象是否属于一个类?• PHP中怎样完成Session的设置、获取和删除?

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网