基于session.upload_progress 的文件上传进度显示
用PHP Session和Javascript实现文件上传进度条
php上传文件并显示上传进度的方法

undefined index: php session upload_progress
Undefined index: PHP_SESSION_UPLOAD_PROGRESS
屏蔽警告提醒

代码片段
1 行
error_reporting(0);

开启session.upload_progress
修改php.ini文件,开启session.upload_progress的支持

GDScript3
6 行
 session.upload_progress.enabled = On
 session.upload_progress.cleanup = On
 session.upload_progress.prefix = "upload_progress_"
 session.upload_progress.name = "PHP_SESSION_UPLOAD_PROGRESS"
 session.upload_progress.freq = "1%"
 session.upload_progress.min_freq = "1"

修改php上传文件限制

GDScript3
5 行
upload_max_filesize = 500M; //上传文件的最大值,还可以调更大
post_max_size = 500M;       //post方式传递过来数据最大值,还可以调更大
max_execution_time = 1800;  //页面最大执行时间,已经设置为最大值
max_input_time = 1800;  //解析传入数据最大执行时间,已经设置为最大值 
memory_limit = 128M;    //每个页面消耗的最大内存,已经设置为最大值

上传表单
注意 别忘了在最开始加上session_start();

input标签的位置
name为session.upload_progress.name的input标签一定要放在文件input <input type="file" /> 的前面

GDScript3
5 行
<form action="file.php" class="ffurr" method="POST" id="upprrsss" name="upprrsss" enctype="multipart/form-data" target="hidden_iframe">
<input type="hidden" name="<?php echo ini_get("session.upload_progress.name"); ?>" value="test" />
<p class="pb10">
<label for="file" style="font-size: 14px;"><i class="fi-photo"></i>请选择上传作品图片:</label>
<input type="file" name="file" id="file" /> </p>

处理上传的文件

GDScript3
3 行
if(is_uploaded_file($_FILES['file']['tmp_name'])){
        move_uploaded_file($_FILES['file']['tmp_name'], "./{$_FILES['file']['name']}");
}

Ajax获取进度信息
建立一个 progress.php 文件,用来读取session中的进度信息

CSS
1 行
<iframe id="hidden_iframe" name="hidden_iframe" src="about:blank" style="display:none;"></iframe>
CSS
4 行
<div id="progress" class="progress" style="margin-bottom:15px;display:none;height: auto;">
        <!--<div class="bar" style="width:0%;"></div>-->
        <div class="label" style="width:0%;">0%</div>
</div>

通过设置 $_SESSION[$key]['cancel_upload'] = true 可取消当次上传。但仅能取消正在上传的文件和尚未开始的文件。已经上传成功的文件不会被删除

setTimeout vs. setInterval
应该通过 setTimeout() 来调用 fetch_progress(),这样可以确保一次请求返回之后才开始下一次请求。如果使用 setInterval() 则不能保证这一点,有可能导致进度条出现'不进反退'

php里提供一个获取php.ini里的变量值的函数:ini_get()

参考
http://www.jb51.net/article/56305.htm