如何使PHP upload_progress SESSION工作?

Art*_*man 17 php

我正在尝试在php.ini中进行一系列更改之后使工作成为upload_progress会话,如:

session.upload_progress.enabled = On

;session.upload_progress.cleanup = On

session.upload_progress.prefix = "upload_progress_"

session.upload_progress.name = "123"

session.upload_progress.freq =  "1%"

session.upload_progress.min_freq = "1"
Run Code Online (Sandbox Code Playgroud)

并创建基于html的页面,并使用表单提交文件:

<form action="upload_progress.php" method="POST" enctype="multipart/form-data">
  <input type="hidden" name="<?php echo ini_get("session.upload_progress.name"); ?>" value="123" />
  <input type="file" name="file1" />
  <input type="file" name="file2" />
  <input type="submit" />
</form>
Run Code Online (Sandbox Code Playgroud)

然后正确上传文件的服务器端脚本:

session_start();
move_uploaded_file($_FILES['file1']['tmp_name'], './uploads/'.$_FILES['file1']['name']);
move_uploaded_file($_FILES['file2']['tmp_name'], './uploads/'.$_FILES['file2']['name']);
print_r($_SESSION);
Run Code Online (Sandbox Code Playgroud)

$_SESSION虽然文件上传正确完成,但全局变量中有一个空数组.会话设置有什么问题?

我使用的是PHP 5.4.5

Notice: Undefined index: upload_progress_123 in C:\apache\localhost\www\upload_progress.php on line 13

小智 5

在 PHP 中通过会话上传进度非常棘手,并且并非所有上下文和情况都有详细记录。号码 类似 问题, 表明 会导致 麻烦。我个人在这方面已经失去了一天多的时间,所以这里是我的建议,可以帮助您。

  1. 明显的基本要求:PHP 版本 >= 5.4.0 并且 PHP作为 FastCGI 运行。(如何找到。
  2. 为了更好地调试,请禁用立即会话属性清理 php.ini
    session.upload_progress.cleanup = 关闭
    这样您就可以在上传完成检查会话的内容。
  3. 找出 session 的存储位置(变量session.save_pathin php.ini,linux 机器上的典型值为/var/lib/php/sessions)并检查它们,查找以upload_progress_xxxxxxxxxxx启动上传命名的索引。

  4. 要激活特定的上传进度跟踪,通常会使用隐藏的 HTML 表单元素。它必须在文件之前发送。如果您考虑一下,这是合乎逻辑的:当 PHP 处理请求时,它必须首先遇到信号以开始跟踪文件上传进度,然后识别文件本身。反过来,它就行不通了。

    <form action="upload_progress.php" method="POST" enctype="multipart/form-data">
        <input type="hidden" 
            name="<?php echo ini_get("session.upload_progress.name"); ?>" value="123" />
        <input type="file" name="myfile1" />
        <input type="submit" />
    </form>
    
    Run Code Online (Sandbox Code Playgroud)
  5. 小心使用 AJAX 提交。尽管不太可能,但一些 JS 库可能会更改 HTTP 请求中元素的顺序。您应该使用浏览器中的开发人员工具检查实际的 HTTP 通信,并确保发送元素的顺序与前一点一致。

  6. 会话名称。虽然您可以在代码中使用任何可能的会话名称,但 PHP 不知道它并始终将上传进度写入默认会话,通常PHPSESSID(查看您php.ini的 属性session.name以检查实际值。)这种行为不是错误。
    如果您介意创建两个会话,您应该更改代码以使用默认值,或者更改session.name并非总是可行的默认值(例如共享主机)。请注意,该值也可以通过 更改.htaccess

  7. 一些 PHP 框架(Zend、Cake PHP)有自己的会话内容结构,PHP 引擎在上传进度写入会话会破坏会话。导致存储信息丢失,从而导致退出、跟踪损坏等影响。问题问题问题。我得出的结论是,在这种情况下,必须使用 2 个不同的会话。

我的最终解决方案

我正在使用 Zend 框架,但最终得到了两个单独的会话。我使用以下纯 PHP 脚本来报告特定的文件上传进度。该脚本与 Zend Framework 完全隔离并使用默认PHPSESSID命名空间。

session.upload_progress.cleanup = Off

在 Zend Framework 之上制作的应用程序在Module.phponBootstrap()方法中设置了自己的会话命名空间:

$sessionManager = new \Zend\Session\SessionManager();
$sessionManager->setName('myFancyNamespace');
$sessionManager->start();
Run Code Online (Sandbox Code Playgroud)


pil*_*lif 0

当您的脚本调用move_uploaded_file()并且连续调用时print_r(),上传已经完成。

如果您想获取上传进度,您必须

  • 将上传的表单提交到不同的浏览器窗口(以便当前页面上的JS可以继续运行)或框架(使用target表单上的属性)
  • 使用ajax调用重复轮询服务器以查询当前会话的上传进度。

http://php.net/manual/en/session.upload-progress.php上的解释是指对同一会话的不同请求,而不是同一请求内的数据。

谷歌搜索出现了一些http://www.sitepoint.com/tracking-upload-progress-with-php-and-javascript/,其中包含更多详细信息并提供了复制和粘贴的示例。