在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. sed备忘

    sed 是一种在线编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送 ...

  2. atitit.提升开发效率---MDA 软件开发方式的革命(3)----自己主动化建表

    atitit.提升开发效率---MDA 软件开发方式的革命(3)----自己主动化建表 1. 建模在后自己主动建表 1 1. 传统上,须要首先建表,在业务编码.. 1 2. 模型驱动建表---很多其它 ...

  3. UVa 1303 - Wall

    题目:有非常多点.修一座最短的围墙把素有点围起来,使得全部点到墙的距离不小于l. 分析:计算几何,凸包. 假设.没有距离l的限制.则答案就是凸包的周长了.有了距离限制事实上是添加了2*π*l. 证明: ...

  4. 微博混合云DCP:极端流量下的峰值应对与架构挑战

    摘要: 在2016杭州云栖大会的“开发者技术峰会”上,来自新浪微博的资深运维架构师王关胜带来题为<微博混合云DCP:极端流量下的峰值应对与架构挑战>的精彩分享,分享中他从微博业务背景及峰值 ...

  5. Javakeyword之this

    this的作用: 1) this是当前对象的一个引用.便于对当前对象參数的使用. 2)能够返回对象的自己这个类的引用.同一时候还能够在一个构造函数其中调用还有一个构造函数 this演示样例: publ ...

  6. Nginx配置error_page 404错误页面

    问题由来 昨天一网友在segmentfault.com上提问,无法做404重定向 打开对方的网站随便输入一个错误的地址发现给出了404代码,但是页面完全空白,并没有显示404页面的设定内容 当时就明白 ...

  7. useradd或者userdel相关用户管理命令不好用

    前言 有时使用useradd或者userdel会出现如下报错: userdel: cannot open /etc/passwd 很明显是/etc/passwd文件导致的 一.查看以及改变文件状态 [ ...

  8. IntelliJ IDEA java项目导入jar包,打jar包

    一.导入 1.java项目在没有导入该jar包之前,如图: 2.点击 File ->  Project Structure(快捷键 Ctrl + Alt + Shift + s),点击Proje ...

  9. HDUOJ----(1084)What Is Your Grade?

    关键是自己没有读懂题目而已,不过还好,终于给做出来了...... What Is Your Grade? Time Limit: 2000/1000 MS (Java/Others)    Memor ...

  10. 使用JavaStcript对数组元素去重的方法

    在做javascript开发的时候,经常会遇到数组元素重复的问题,而javascript Array又没有直接提供方法解决此问题,还需要自己去实现. 方案一: 思路: 1.构建一个新的数组存放结果: ...