php实现上传进度条的步骤:首先向服务器端上传一个文件;然后用PHP将这次文件上传的具体信息储存在session当中;接着用Ajax周期性的恳求一个服务器端脚本;最后通过浏览器端的Javascript显示更新进度条即可。
推荐:《PHP视频教程》
实现文件上传进度条基本是借助JS插件或HTML5的File API来完成,其实PHP配合ajax也能实现此功能。
PHP指南对于session上传进度是这样介绍的:
当 session.upload_progress.enabled INI 选项开启时,PHP 能够在每一个文件上传时监测上传进度。 这个信息对上传请求自身并没有什么帮助,但在文件上传时应用可以发送一个POST请求到终端(例如通过XHR)来检查这个状态
当一个上传在处理中,同时POST一个与INI中设置的session.upload_progress.name同名变量时,上传进度可以在$_SESSION中获得。 当PHP检测到这种POST请求时,它会在$_SESSION中添加一组数据, 索引是 session.upload_progress.prefix 与 session.upload_progress.name连接在一起的值。 通常这些键值可以通过读取INI设置来获得,例如
通过将$_SESSION[$key]["cancel_upload"]设置为TRUE,还可以取消一个正在处理中的文件上传。 当在同一个请求中上传多个文件,它仅会取消当前正在处理的文件上传和未处理的文件上传,但是不会移除那些已经完成的上传。 当一个上传请求被这么取消时,$_FILES中的error将会被设置为 UPLOAD_ERR_EXTENSION。
session.upload_progress.freq 和 session.upload_progress.min_freq INI选项控制了上传进度信息应该多久被重新计算一次。 通过合理设置这两个选项的值,这个功能的开销几乎可以忽略不计。
注意:为了使这个正常工作,web服务器的请求缓冲区需要禁用,否则 PHP可能仅当文件完全上传完成时才能收到文件上传请求。 已知会缓冲这种大请求的程序有Nginx。
下面原理介绍:
当浏览器向服务器端上传一个文件时,PHP将要把这次文件上传的具体信息(如上传时间、上传进度等)存储在session当中。然后php上传视频进度条,随着上传的进行,周期性的更新session中的信息。这样,浏览器端就可以使用Ajax周期性的恳求一个服务器端脚本,由该脚本返回session中的进度信息;浏览器端的Javascript即可按照这种信息显示/更新进度条了。
php.ini需配置以下选项
session.upload_progress.enabled = "1"
session.upload_progress.cleanup = "1"
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"
其中enabled控制upload_progress功能的开启与否,默认开启;
cleanup 则设置当文件上传的恳求递交完成后,是否去除session的相关信息,默认开启,如果还要调试$_SESSION,则应当设为Off。
prefix 和 name 两项拿来设置进度信息在session中储存的变量名/键值。
freq 和 min_freq 两项拿来设置服务器端对进度信息的更新速率。合理的设置这两项可以减少服务器的负担。
在上传文件的表单中php上传视频进度条,需要为该次上传设置一个标识符,并在接下来的过程中使用该标识符来引用进度信息。
具体的,在上传表单中还要有一个掩藏的input,它的name属性为php.ini中 session.upload_progress.name 的值;它的值为一个由你自己定义的标识符。如下:
代码如下:
PHP(5.4) Session 上传进度 Demo
body{
font-size:1em;
color:#333;
font-family: "宋体", Arial, sans-serif;
}
h1, h2, h3, h4, h5, h6{
font-family: "宋体", Georgia, serif;
color:#000;
line-height:1.8em;
margin:0;
}
h1{ font-size:1.8em; }
#wrap{
margin-top:15px;
margin-bottom:50px;
background:#fff;
border-radius:5px;
box-shadow:inset 0 0 3px #000,
0 0 3px #eee;
}
#header{
border-radius:5px 5px 0 0;
box-shadow:inset 0 0 3px #000;
padding:0 15px;
color:#fff;
background: #333333;
}
#header h1{
color:#fff;
}
#article{
padding:0 15px;
}
#footer{
text-align:center;
border-top:1px solid #ccc;
border-radius:0 0 5px 5px;
}
.progress {
width: 100%;
border: 1px solid #4da8fe;
border-radius: 40px;
height: 20px;
position: relative;
}
.progress .labels {
position: relative;
text-align: center;
}
.progress .bar {
position: absolute;
left: 0;
top: 0;
background: #4D90FE;
height: 20px;
line-height:20px;
border-radius: 40px;
min-width: 20px;
}
.report-file {
display: block;
position: relative;
width: 120px;
height: 28px;
overflow: hidden;
border: 1px solid #428bca;
background: none repeat scroll 0 0 #428bca;
color: #fff;
cursor: pointer;
text-align: center;
float: left;
margin-right:5px;
}
.report-file span {
cursor: pointer;
display: block;
line-height: 28px;
}
.file-prew {
cursor: pointer;
position: absolute;
top: 0;
left:0;
width: 120px;
height: 30px;
font-size: 100px;
opacity: 0;
filter: alpha(opacity=0);
}
.container{
padding-left:0;
padding-right:0;
margin:0 auto;
}
Session上传进度 Demo