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