在PHP5.4版本当中给我们提供了好用的特性,上传进度的支持,我们可以配合Ajax动态获取SESSION当中的上传进度:

在使用这一特性之前,需要现在php.ini文件当中进行相应的设置:

 
1
2
3
4
5
6
session.upload_progress.enabled[ = On] :                         是否启用上传进度报告(默认开启)
session.upload_progress.cleanup[ = Off] :                        是否在上传完成后及时删除进度数据(默认开启, 推荐开启).
session.upload_progress.prefix[ = upload_progress_ ] :           进度数据将存储在$_SESSION[session.upload_progress.prefix . $_POST[session.upload_progress.name]]
session.upload_progress.name[ = PHP_SESSION_UPLOAD_PROGRESS ] :  如果_POST[session.upload_progress.name]没有被设置, 则不会报告进度.
session.upload_progress.freq[ = 1% ] :                           更新进度的频率(已经处理的字节数), 也支持百分比表示’%’.
session.upload_progress.min_freq[ = 1.0] :                       更新进度的时间间隔(秒级)

需要注意的是,session.upload_progress.cleanup的值我们修改为off,否则文件上传完毕,session会把上传报告删除,以节省服务器资源,这样不便于我们做实验。

接下来,我们只需要做的就是完成form表单的书写:

upload.php

 
1
2
3
4
5
<form action="doupload.php" method="post" enctype="multipart/form-data">
    <input type="hidden" name="<?php echo ini_get(session.upload_progress.name) ?>" value="jiege" />
    请选择文件:<input type="file" name="pic" /><br />
    <input type="submit" value="上传" />
</form>

这里的表单,必须提供一个session.upload_progress.name对应的值,否则将无法使用文件上传报告。

开启后,我们即可在doupload.php中,通过SESSION接收文件上传进度:

doupload.php

 
1
2
3
4
5
<?php
    session_start();
    echo "<pre>";
    var_dump($_SESSION);
    echo "</pre>";

输出结果:

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
array(1) {
  ["upload_progress_jiege"]=>
  array(5) {
    ["start_time"]=>
    int(1407314201)
    ["content_length"]=>
    int(653829)
    ["bytes_processed"]=>
    int(653829)
    ["done"]=>
    bool(true)
    ["files"]=>
    array(1) {
      [0]=>
      array(7) {
        ["field_name"]=>
        string(3) "pic"
        ["name"]=>
        string(15) "1-140HP95Z0.rar"
        ["tmp_name"]=>
        string(27) "C:\Windows\Temp\phpD9C3.tmp"
        ["error"]=>
        int(0)
        ["done"]=>
        bool(true)
        ["start_time"]=>
        int(1407314201)
        ["bytes_processed"]=>
        int(653508)
      }
    }
  }
}

我们可以看到,session的上传报告的下标为upload_progress_jiege,该名称的组成即为php.ini文件当中的session.upload_progress.prefix的值与表单隐藏域的值的组成,因此,大家需要注意,表单当中的这个隐藏域一定要定义,否则无法获取上传报告。

报告当中包含的值分别代表:

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
array(1) {
  ["upload_progress_jiege"]=>
  array(5) {
    ["start_time"]=>            //请求时间
    int(1407314201)
    ["content_length"]=>        //上传的所有文件的总大小
    int(653829)
    ["bytes_processed"]=>       //上传已完成的大小
    int(653829)
    ["done"]=>                  //是否已经处理完毕
    bool(true)
    ["files"]=>                 //所有文件
    array(1) {
      [0]=>
      array(7) {
        ["field_name"]=>                               //表单名称
        string(3) "pic"
        ["name"]=>
        string(15) "1-140HP95Z0.rar"                   //原文件名称
        ["tmp_name"]=>
        string(27) "C:\Windows\Temp\phpD9C3.tmp"       //上传的临时文件名称
        ["error"]=>                                    //上传产生的错误
        int(0)
        ["done"]=>                                     //该文件是否已经处理完毕
        bool(true)
        ["start_time"]=>                               //请求时间
        int(1407314201)
        ["bytes_processed"]=>                          //已经处理的文件大小
        int(653508)
      }
    }
  }
}

接下来,大家就可以使用Ajax技术将产生的上传报告异步加载即可。

PHP5.4新特性之上传进度支持Upload progress的更多相关文章

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

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

  2. PHP5.3, PHP5.4, PHP5.5新特性

    PHP 5.3中的新特性 1. 支持命名空间 (Namespace) 2. 支持延迟静态绑定(Late Static Binding) 3. 支持goto语句 4. 支持闭包.Lambda/Anony ...

  3. php5.3 PHP5.4 PHP5.5 新特性/使用PHP5.5要注意的

      1.PHP 5.3中的新特性 1.1 PHP 5.3中的新特性 1.1.1. 支持命名空间 (Namespace) 毫无疑问,命名空间是PHP5.3所带来的最重要的新特性. 在PHP5.3中,则只 ...

  4. PHP5.4新特性

    PHP5.4 此次更新的关键新特性,包括:新增traits,更精简的Array数组语法,供测试使用的内建webserver,可以闭包使用的$this指针,实例化类成员访问, PHP 5.4.0 性能大 ...

  5. php5.4新特性实践

    本机安装的是wampserver2.2e-php5.4.3-httpd2.2.22-mysql5.5.24-32b.exe集成包 自带了php5.4 1. 数组写法 定义一个数组 过去: $arr = ...

  6. PHP5.4新特性(转)

    PHP5.4正式前两天发布了,之前有看了一些PHP5.4主要特性相关文章,因此在这里小结一下. 其中好几点更新是由Laruence贡献的!本文部分内容也是源自Laruence的博客. 1. Buid- ...

  7. php5.3新特性 之 mysql native driver(mysqlnd)

    概述 本文主要写给sa看的.码农就不用看了. mysql native driver(mysqlnd) 自从php5.3.0开始成为官方源代码的一部分, 用来取代传统的mysql client lib ...

  8. PHP5.3新特性

    1.首先对之前滥用的语法进行了规范 众所周知PHP在语言开发过程中有一个很好的容错性,导致在数组或全局变量中包含字符串不使用引号是可以不报错的,很多业余的开发者因为懒惰而产生的安全问题十分严重,之所以 ...

  9. Php5.5新特性 Generators详解

    在PHP5.5.0版本中,新增了生成器(Generators)特性,用于简化实现迭代器接口(Iterator)创建简单的迭代器的复杂性. 通过生成器,我们可以轻松的使用foreach迭代一系列的数据, ...

随机推荐

  1. 批量上传插件(flash,html5,jquery)

    1.jQuery File Upload 官网:http://blueimp.github.com/jQuery-File-Upload/ 在线示例:http://blueimp.github.com ...

  2. 谷歌地图api訪问失败

    在非外网情况下.我们调用谷歌api会出现载入不到地图的现象.此时能够换一下域名试试或许就好了 比方我自己訪问api时时这样写的: https://maps.googleapis.com/maps/ap ...

  3. eclipse下java中凝视字体太小和xml中中文字体太小问题解决方法

    我们在win7下进行android应用开发.须要搭建对应的开发环境.如今普遍基本上都是eclipse+adt+sdk,在本人搭建完环境后,发现eclipse下.java中的凝视和xml中的中文字体变得 ...

  4. 让 linux centos 文件夹地址栏 位置栏显示出来的方法

    今天又拿起心爱的 linux ,发现多日不用又忘记了不少知识了    , 发现忘记的速度真是惊人的! 设置方法: 编辑-> 首选项-> 勾选 总是在浏览器窗口中打开,  如图:

  5. [转载]ubuntu发热问题解决

    原文地址:ubuntu发热问题解决作者:raosea 没事装了个ubuntu12.04玩玩. 用wubi安装,很省事的 .完了以后启动了系统,界面蛮好看.可是不久令人费心的事情出来了. 我发现本本的右 ...

  6. 微信小程序 HelloWorld

    本篇文章由:http://xinpure.com/micro-applet-helloworld/ 微信官方文档及工具已经开放!!! https://mp.weixin.qq.com/debug/wx ...

  7. App上架重磅通知:App Store安全新规17年1月生效

    作者:沙铭 来源:公众号 沙铭世界观 ID:mobview 做推广的也许并不了解什么是ATS(App Transport Security),不过这却是一个定时炸弹,引爆点在2016年底,后果就是你不 ...

  8. java 移位

    java中没有2进制的数据类型,对二进制的操作,需要使用三种操作符 << 左移位操作符,算数左移           用来将一个数的二进制位序列左移若干位,高位左移后溢出,舍弃不用,右补0 ...

  9. android中完全退出当前应用程序的四种方法

    Android程序有很多Activity,比如说主窗口A,调用了子窗口B,如果在B中直接finish(), 接下里显示的是A.在B中如何关闭整个Android应用程序呢?本人总结了几种比较简单的实现方 ...

  10. sleep()和usleep()的使用和区别

    在iOS中  如果 在主线程中用这2个 都会 对 主线程 造成 阻塞 具体区别 如下   Linux 中的 代码 为例 函数名: sleep头文件: #include <windows.h> ...