PHP5.4新特性之上传进度支持Upload progress

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

上一篇:基于Linux的Samba开源共享解决方案测试(一)


下一篇:HAOI2017 新型城市化 二分图的最大独立集+最大流+强连通缩点