$files = $_FILES['fileselect'];
foreach ($files['error'] as $id => $err) {
if ($err == UPLOAD_ERR_OK) {
$fn = $files['name'][$id];
move_uploaded_file(
$files['tmp_name'][$id],
'uploads/' . $fn
);
echo "
File $fn uploaded.
";
}
}
}
以上这段代码即是针对普通的表单上传代码。
显示上传进度条
接下来,为了方便用户,需要显示一个上传的进度条。在HTML4的时代里,显示进度条是比较麻烦的,需要其他一些Javascript技巧。在HTML5中,出现了进度条的属性功能(目前在FireFox和Chrome中的XmlHttpRequest2)中对其进行了支持。
HTML5中的进度条属性中,有两个分别是:value和Max。其中value显示当前进度条的值得,Max的值为定义进度条最大的值。很不幸的是,目前HTML5标准中对进度条的定义中,缺乏样式上的定义,因此只能靠开发者对其进行美化,定义样式如下:
{
display: block;
width: 240px;
padding: 2px 5px;
margin: 2px 0;
border: 1px inset #446;
border-radius: 5px;
}
其中,设计了一张进度条,宽度设计为500px,其中250px为绿色部分,即已读取部分,右边的250px部分设置为透明。
这里,我们根据上传的进度,动态设置其样式,定义为“X% 0″,其中X表示剩余多少部分是还没上传完成的,比如:“background-position: 100% 0表示刚开始上传,还没完成任何部分,background-position: 0% 0表示0%剩余,即已经全部完成上传,
background-position: 30% 0″表示还有30%还没完成上传。
另外,还设计了当上传成功或失败时,所需要的样式,如下所示:
{
background: #0c0 none 0 0 no-repeat;
}
#progress p.failed
{
background: #c00 none 0 0 no-repeat;
}
接下来修改之前的uploadfile()方法,添加如下代码:
var xhr = new XMLHttpRequest();
if (xhr.upload && file.type == "image/jpeg" && file.size <= $id("MAX_FILE_SIZE").value) {
var o = $id("progress");
var progress = o.appendChild(document.createElement("p"));
progress.appendChild(document.createTextNode("upload " + file.name));
这里增加了关于进度条的样式,并添加了文字说明,说明上传的文件名。回忆一下,
这里的var o = $id("progress");实际上是找到了页面中设定的HTML5中的progress标签元素。
接下来,我们在xmlHttpRequest2的upload事件中增加关于上传进度的计算,如下代码:
var pc = parseInt(100 - (e.loaded / e.total * 100));
progress.style.backgroundPosition = pc + "% 0";
},
其中PC为剩余的上传进度,并且赋值给progress的CSS样式。最后,如果你熟AJAX,则知道通过onreadystatechange去判断是否文件上传完成,代码如下:
if (xhr.readyState == 4) {
progress.className = (xhr.status == 200 ? "success" : "failure");
}
};
同样,通过readState去判断是否上传成功,并设置相关的CSS样式。至于其他部分代码,则不需要再修改了。
现在,一个带进度条的上传文件的例子就做好了,具体的代码可以通过
http://blogs.sitepointstatic.com/examples/tech/filedrag/3/filedrag3.zip下载。
小结
在本系列的两个教程中,指导读者认识了HTML5中新的文件API接口,它允许用户从本地机器的文件夹中直接拖拉文件到浏览器中,并讲解了如何 分析选中上传文件的文件信息,最后还利用了HTML5中的新特性xmlHttpRequest 2及进度条的标签,实现了一个带进度条的上传功能。