‘编程技术’ 目录下的博文

仿ajax无刷新上传文件

  在做的一个基本全用ajax(什么是ajax)的项目,接近收工时碰到一个头痛的问题,上传文件无法用ajax实现。后来想了一下也确实是这样,ajax与后台通信全部是通过传递字符串的,怎么可能传递文件呢?再说出于安全考虑,js也是不能操作文件的,更不要说ajax上传文件了。

  经过网上搜索,学会了一中方法,实现“类似ajax”的无刷新上传文件。

  其实在ajax技术出现之前web应用就可以实现无刷新的,主要用iframe。当ajax出现,并由google带动起来后,大家都去使用ajax,iframe也无人问津了。但是可以去看一下gmail的文件上传,还是在用iframe。也就是说,要实现无刷新上传文件,iframe还是最佳的选择。

代码(只有关键部分,其它部分与正常文件上传类似):

html

  1. <form id="upform" enctype="multipart/form-data" action="upload.php" method="post" target="hidden_frame">
  2.   <input type="file" name="file" id="file" onchange="upload()" />
  3.   <input type="hidden" name="MAX_FILE_SIZE" value"10485760" />
  4.   <div id="upmsg"></div>
  5. </form>
  6. <iframe id="hidden_frame" name="hidden_frame" style="display:none"></iframe>

  当中比较关键的是form里的target=”hidden_frame”,和一个name=”hidden_frame”的隐藏的iframe。这样form上传的处理就会在隐藏的iframe中进行,大页面没有刷新。

js

  1. function upback(msg)
  2. {
  3. document.getElementById("file").value="";
  4. document.getElementById("file").outerHTML=document.getElementById("file").outerHTML;
  5. document.getElementById("upmsg").innerHTML=msg;
  6. }

  js函数的前两行就是用来清空上传框的,由于浏览器差异,清空的方法有点不同请注意一下。然后把后台的返回信息显示到预留的空间里。

php

  1. <?php
  2. echo <script type="text/javascript">parent.upback("文件上传成功")</script>;
  3. ?>

  后台上传文件的过程这里就不贴了,关键就是返回信息时,在iframe里输出js代码来控制它的父页面。

  最终这三部分合作就能完成“仿ajax”的无刷新上传文件了,你也试试吧。