php iframe实现无刷新文件上传

首先ajax不能上传文件,这误导了我有段时间,今晚睡不着就照着说明做了个无刷新上传文件,其实原理很简单,代码如下:

  1. <form enctype="multipart/form-data" method="POST" target="upload" action="http://localhost/class.upload.php" >
  2. <input type="file" name="uploadfile" />
  3. <input type="submit" />
  4. </form>
  5. <iframe name="upload" ></iframe>

和一般的<form>标签相比多了一个target属性罢了,用于指定标签页在哪里打开以及提交数据,如果没有设置该属性,就会像平常一样在本页重定向打开action中的url.

而如果设置为iframe的name值,即"upload"的话,就会在该iframe内打开,因为CSS设置为隐藏,因而不会有任何动静,若将display:none去掉,还会看到服务器的返回信息.

另外贴一下自己组织的类,代码如下:

  1. class upload
  2. {
  3. public $_file;
  4. public function __construct( $name =null)
  5. {
  6. if(is_null($name) || !isset($_FILES[$name]))
  7. $name = key($_FILES);
  8. if(!isset($_FILES[$name]))
  9. throw new Exception("并没有文件上传");
  10. $this->_file = $_FILES[$name];
  11. if(!is_uploaded_file($this->_file['tmp_name']))
  12. throw new Exception("异常情况");
  13. if($this->_file['error'] !== 0)
  14. throw new Exception("错误代码:".$this->_file['error']);
  15. }
  16. public function moveTo( $new_dir)
  17. {
  18. $real_dir = $this->checkDir($new_dir);
  19. return move_uploaded_file($this->_file['tmp_name'], $real_dir.'/'.$this->_file['name']);
  20. }
  21. private function checkDir($dir)
  22. {//开源代码phpfensi.com
  23. $real_dir = realpath($dir);
  24. if($real_dir === false)
  25. throw new Exception("给定目录{$dir}不存在");
  26. if(!is_writable($real_dir))
  27. throw new Exception("给定目录{$dir}不可写");
  28. return $real_dir;
  29. }
  30. }

调用示例,代码如下:

  1. $inputName = 'uploadfile';
  2. // 即<input type=“file" name="uploadfile" /> 中的name值,不填也行
  3. $upload = new upload($inputName);
  4. $new_dir = "/www"; // 将文件移动到的路径
  5. $upload->moveTo($new_dir);