在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技术将产生的上传报告异步加载即可。

最新文章

  1. MySql: 常见sql语句
  2. Java设计模式(二) 观察者模式
  3. Xcode添加注释
  4. App所需申请资料
  5. Python函数中的参数(一)
  6. “/wechat”应用程序中的服务器错误。
  7. JavaWeb笔记——ajax异步请求
  8. 在Windows2012下安装SQL Server 2005无法启动服务的解决办法
  9. PYTHON设计模式,创建型之简单工厂模式
  10. 使用静态资源设置UI信息
  11. 如何在ASP.NET中用C#将XML转换成JSON 【转】
  12. JAVA 统计字符串中中文,英文,数字,空格的个数
  13. VS2012下使用Moq进行单元测试
  14. [转载]linux修改open files数
  15. 一个网卡配置多个ip配置实现,centos7系统
  16. 从数据恢复角度解析RAID6结构原理
  17. 原生js实现canvas气泡冒泡效果
  18. Lua语法基础(一)
  19. Maven 在新版eclipse报错的解决
  20. HAAR与DLib的实时人脸检测之实现与对比

热门文章

  1. this词法
  2. Oracle 删除表中记录 如何释放表及表空间大小
  3. JSONP简单例子
  4. linux安装JDK环境,JDK6.0即java 1.6.0
  5. wso2esb安装及helloworld
  6. Web服务器(容器)请求常见的错误及其解决方法
  7. LoadRunner脚本关联动态数据的最简单方法
  8. ASP.NET DataBase
  9. HDUOJ-----2399GPA
  10. ngx_lua学习笔记 -- capture + proxy 实现httpclient