图集1/3

正文 4110字数 745,941阅读


基于session.upload_progress 的文件上传进度显示
用PHP Session和Javascript实现文件上传进度条
php上传文件并显示上传进度的方法

undefined index: php session upload_progress
Undefined index: PHP_SESSION_UPLOAD_PROGRESS
屏蔽警告提醒
error_reporting(0);
Run code
Cut to clipboard


    开启session.upload_progress
    修改php.ini文件,开启session.upload_progress的支持
    session.upload_progress.enabled = On session.upload_progress.cleanup = On session.upload_progress.prefix = "upload_progress_" session.upload_progress.name = "PHP_SESSION_UPLOAD_PROGRESS" session.upload_progress.freq = "1%" session.upload_progress.min_freq = "1"
    Run code
    Cut to clipboard


      修改php上传文件限制
      upload_max_filesize = 500M; //上传文件的最大值,还可以调更大 post_max_size = 500M; //post方式传递过来数据最大值,还可以调更大 max_execution_time = 1800; //页面最大执行时间,已经设置为最大值 max_input_time = 1800; //解析传入数据最大执行时间,已经设置为最大值 memory_limit = 128M; //每个页面消耗的最大内存,已经设置为最大值
      Run code
      Cut to clipboard


        上传表单
        注意 别忘了在最开始加上session_start();

        input标签的位置
        name为session.upload_progress.name的input标签一定要放在文件input <input type="file" /> 的前面
        <form action="file.php" class="ffurr" method="POST" id="upprrsss" name="upprrsss" enctype="multipart/form-data" target="hidden_iframe"> <input type="hidden" name="<?php echo ini_get("session.upload_progress.name"); ?>" value="test" /> <p class="pb10"> <label for="file" style="font-size: 14px;"><i class="fi-photo"></i>请选择上传作品图片:</label> <input type="file" name="file" id="file" /> </p>
        Run code
        Cut to clipboard


          处理上传的文件
          if(is_uploaded_file($_FILES['file']['tmp_name'])){ move_uploaded_file($_FILES['file']['tmp_name'], "./{$_FILES['file']['name']}"); }
          Run code
          Cut to clipboard


            Ajax获取进度信息
            建立一个 progress.php 文件,用来读取session中的进度信息
            <?php error_reporting(0); session_start(); $i = ini_get('session.upload_progress.name'); $key = ini_get('session.upload_progress.prefix') . $_GET[$i]; //print_r($key);exit; if (isset($_SESSION[$key])) { $current = $_SESSION[$key]["bytes_processed"]; $total = $_SESSION[$key]["content_length"]; echo $current < $total ? ceil($current / $total * 100) : 100; }else{ echo 100; }
            Run code
            Cut to clipboard


              function fetch_progress(){ $.get('progress.php',{ '<?php echo ini_get("session.upload_progress.name"); ?>' : 'test'}, function(data){ var progress = parseInt(data); $('#progress .label').html(progress + '%'); $('#progress .label').css('width', progress + '%'); //$('#progress .bar').css('width', progress + '%'); if(progress < 100){ setTimeout('fetch_progress()', 100); }else{ $('#zesscc').hide(); $('#progress .label').html('上传完成!'); setTimeout(function(){ location.href = '/sybyzt.php'; }, 1500); } }, 'html'); } /*$('#upprrsss').submit(function(){ alert(321); $('#progress').show(); setTimeout('fetch_progress()', 100); });*/
              Run code
              Cut to clipboard


                <iframe id="hidden_iframe" name="hidden_iframe" src="about:blank" style="display:none;"></iframe>
                Run code
                Cut to clipboard


                  <div id="progress" class="progress" style="margin-bottom:15px;display:none;height: auto;"> <!--<div class="bar" style="width:0%;"></div>--> <div class="label" style="width:0%;">0%</div> </div>
                  Run code
                  Cut to clipboard


                    通过设置 $_SESSION[$key]['cancel_upload'] = true 可取消当次上传。但仅能取消正在上传的文件和尚未开始的文件。已经上传成功的文件不会被删除

                    setTimeout vs. setInterval
                    应该通过 setTimeout() 来调用 fetch_progress(),这样可以确保一次请求返回之后才开始下一次请求。如果使用 setInterval() 则不能保证这一点,有可能导致进度条出现'不进反退'

                    php里提供一个获取php.ini里的变量值的函数:ini_get()

                    参考
                    http://www.jb51.net/article/56305.htm