菜单

上传进度支持(Upload progress in sessions)

2014-12-19 - 优秀原创

文件上传进度反馈, 这个需求在当前是越来越普遍, 比如大附件邮件. 在PHP5.4以前, 我们可以通过APC提供的功能来实现. 或者使用PECL扩展uploadprogress来实现.

虽然说, 它们能很好的解决现在的问题, 但是也有很明显的不足:

从PHP的角度来说, 最好的储存这些信息的地方应该是SESSION, 首先它是PHP原生支持的机制. 其次, 它可以被配置到存放到任何地方(支持多机共享).

正因为此, Arnaud Le Blanc提出了针对Session报告上传进度的RFC, 并且现在实现也已经包含在了PHP5.4的主干中.

这个新特性, 提供了一些新的INI配置, 他们和APC的相关配置很类似:

对于如下的上传表单:

  1. <form action=“upload.php” method=“POST” enctype=“multipart/form-data”>
  2.  <input type=“hidden”
  3.      name=“<?php echo ini_get(“session.upload_progress.name“); ?>” value=“laruence” />
  4.  <input type=“file” name=“file1” />
  5.  <input type=“file” name=“file2” />
  6.  <input type=“submit” />
  7. </form>

如果我们上传一个足够大的文件(网速要是足够慢就更好:P), 我们就可以从_SESSION中, 得到类似下面的进度信息:

  1. $_SESSION[“upload_progress_laruence”] = array(
  2.  “start_time” => 1234567890, // 请求时间
  3.  “content_length” => 57343257, // 上传文件总大小
  4.  “bytes_processed” => 453489, // 已经处理的大小
  5.  “done” => false, // 当所有上传处理完成后为TRUE
  6.  “files” => array(
  7.   0 => array(
  8.    “field_name” => “file1”, // 表单中上传框的名字
  9.    // The following 3 elements equals those in $_FILES
  10.    “name” => “foo.avi”,
  11.    “tmp_name” => “/tmp/phpxxxxxx”,
  12.    “error” => 0,
  13.    “done” => true, // 当这个文件处理完成后会变成TRUE
  14.    “start_time” => 1234567890, // 这个文件开始处理时间
  15.    “bytes_processed” => 57343250, // 这个文件已经处理的大小
  16.   ),
  17.   // An other file, not finished uploading, in the same request
  18.   1 => array(
  19.    “field_name” => “file2”,
  20.    “name” => “bar.avi”,
  21.    “tmp_name” => NULL,
  22.    “error” => 0,
  23.    “done” => false,
  24.    “start_time” => 1234567899,
  25.    “bytes_processed” => 54554,
  26.   ),
  27.  )
  28. );

这个是不是很方便呢?

但是还是要提醒一下, PHP 5.4还处于开发阶段, 在最终release之前, 任何新特性都可能被调整或者更改. 如果大家有任何建议, 也欢迎反馈, 帮助我们使得PHP变得更好.

谢谢

转载请注明: 转载自—艾瑞可erik

本文链接地址: http://erik.xyz/576.html

发表评论