PhP 5.4中的PhP上传进度无效.会话变量未设置

Sun*_*nny 5 php ajax jquery file-upload

我在一开始就遇到了PhP文件上传进度监视器的问题.

首先,这是相关的PhP.ini设置(指令,本地值和主值):

     session.upload_progress.cleanup    On  On
     session.upload_progress.enabled    On  On
     session.upload_progress.freq   1%  1%
     session.upload_progress.min_freq   1   1
     session.upload_progress.name   PHP_SESSION_UPLOAD_PROGRESS  PHP_SESSION_UPLOAD_PROGRESS
     session.upload_progress.prefix upload_progress_    upload_progress_
Run Code Online (Sandbox Code Playgroud)

这是表格(简化):

     <form id="fileupload" style="position:relative;" target="iframe_fileupload" action="http://www.athiyoga.org/testupload.php" method="POST" enctype="multipart/form-data">
            <input type="hidden" name="<?echo ini_get("session.upload_progress.name");?>" value="first"/>
             <input type="file" name="file_1">
            <button type="submit" >Start Submit</button>
      </form>
Run Code Online (Sandbox Code Playgroud)

我有JQUERY Ajax代码,在同一个PhP文件中(当然,作为JS脚本),如:

    $('#fileupload').submit(function(event){

    //UPDATED THIS PART after reading: http://stackoverflow.com/questions/19336610/delay-in-populating-session-upload-progress-data
    //POSTING the magic variable PHP_SESSION_UPLOAD_PROGRESS during status inquiry too

       var params = {PHP_SESSION_UPLOAD_PROGRESS:"first", some_var:20 };
       var data_params = jQuery.param( params );
       setTimeout(function(){
              upload_promise = $.ajax({
                url: 'upload_status.php', 
                data: data_params,
                dataType: 'html',
                type    : 'POST',
                cache   : false 
             });
             $.when(upload_promise).done(function(status_response){
                   $('#response_status').html(status_response);
             });
        },5000);
      ...
      ...
Run Code Online (Sandbox Code Playgroud)

upload_status.php简单地回显了$ _SESSION数组.我还在form-php中设置了一个测试会话变量,以确保AJAX(通过upload_status.php)选择该会话变量.确实如此.但不是$ _SESSION数组中上传状态的符号(无变量/索引)!文件上传.我确保文件足够大,以便5000毫秒足以报告一些中间状态.

我之前从未实现过PhP文件上传进度条,所以我想知道我是否遗漏了一些东西.一旦我在上传中获得一个状态点,我将能够完成剩下的工作.

谢谢

小智 11

可能会有一些问题,我已经列出了一些问题.

  • 必须禁用Web服务器的请求缓冲才能使其正常工作,否则PHP只能在完全上载后才能看到文件上载.
  • 当您的Web服务器通过FastCGI运行PHP时,此功能不起作用.
  • 不要忘记,在生成表单之前必须初始化会话,否则您将不会在会话中获得任何信息.
  • 它不适用于PHP 5.3或更早版本.
  • 请注意,如果您运行该代码并打印出$ _SESSSION [$ key]的内容,则会得到一个空数组,因为默认情况下session.upload_progress.cleanup处于打开状态,并且只要所有POST数据都已清除就会清除进度信息读.将其设置为Off或0以查看$ _SESSION [$ key]的内容.

这可以帮助您跟踪进度条http://pecl.php.net/package/uploadprogress

我希望这能帮助你解决问题.

  • 我很难学会上述所有问题.很高兴在一个地方.赞成你的答案.在第二个想法,只是决定继续接受它作为一个答案,因为它恰好是答案.如果可能,只需编辑您的答案,添加可以使用PHP <5.4的APC方法,但也要求禁用FastCGI.谢谢. (2认同)