技术开发 频道

HTML5与Ajax强强联手 演绎文件上传

 else {

  $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标准中对进度条的定义中,缺乏样式上的定义,因此只能靠开发者对其进行美化,定义样式如下:

 #progress p

  {

  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%还没完成上传。

  另外,还设计了当上传成功或失败时,所需要的样式,如下所示:

 #progress p.success

  {

  background: #0c0 none
0 0 no-repeat;

  }

  #progress p.failed

  {

  background: #c00 none
0 0 no-repeat;

  }

 接下来修改之前的uploadfile()方法,添加如下代码:

function UploadFile(file) {

  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事件中增加关于上传进度的计算,如下代码:

 xhr.upload.addEventListener("progress", function(e) {

  var pc
= parseInt(100 - (e.loaded / e.total * 100));

  progress.style.backgroundPosition
= pc + "% 0";

  },

  其中PC为剩余的上传进度,并且赋值给progress的CSS样式。最后,如果你熟AJAX,则知道通过onreadystatechange去判断是否文件上传完成,代码如下:

xhr.onreadystatechange = function(e) {

  
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及进度条的标签,实现了一个带进度条的上传功能。

0
相关文章