PhP 5.4 中的 PhP 上传进度不起作用。未设置会话变量

Posted

技术标签:

【中文标题】PhP 5.4 中的 PhP 上传进度不起作用。未设置会话变量【英文标题】:PhP Upload progress in PhP 5.4 is not working. Session variables not set 【发布时间】:2014-03-09 07:28:41 【问题描述】:

我一开始就遇到了 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_

这是表格(简化):

     <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>

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

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

    //UPDATED THIS PART after reading: http://***.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);
      ...
      ...

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

我以前从未实现过 PhP 文件上传进度条,所以我想知道我是否遗漏了什么。一旦我在上传中获得一个状态点,我就可以完成其余的工作。

谢谢

【问题讨论】:

dave-bond.com/blog/2010/01/JQuery-ajax-progress-HMTL5 你查看了那个 rifht php.net/manual/en/session.upload-progress.php @dollarVar。我已经阅读了它并在您的消息之后再次阅读它只是为了看看我是否遗漏了什么。仍然没有运气。我犯了一些错误,但更早地纠正了它们。我知道这一定很简单。我确实赞成你的建议。 好吧,就我所见,你不能回显整个数组。 upload_status.php 只是简单地回显了 $_SESSION 数组。 你的表单也有错误。 &lt;?echo 应该是 &lt;?php echo&lt;?=。 (如果启用了开放式短标签***.com/questions/200640/…) 据我从谷歌上了解到 FastCGI 不支持此功能,您可以尝试使用客户端解决方案:uploadify.com/documentation/uploadifive/onprogress 【参考方案1】:

可能有一些问题,我列出了其中的几个。

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

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

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

【讨论】:

我已经通过艰难的方式了解了上述所有问题。很高兴把它放在一个地方。已赞成您的答案。再三考虑,只是决定继续接受它作为答案,因为无论如何它恰好是答案。如果可能的话,只需编辑您的答案以添加可以与 PHP 嘿,非常感谢。你的总结很有帮助。

以上是关于PhP 5.4 中的 PhP 上传进度不起作用。未设置会话变量的主要内容,如果未能解决你的问题,请参考以下文章

php文件上传进度条例子

进度条在 XMLHTTPRequest 中不起作用

CodeIgniter 上传进度

Laravel 5.4 - 拖放不起作用

PHP上传表单不起作用

iPhone中的简单php帖子不起作用