使用PHP和HTML5 FormData实现无刷新文件上传教程


Posted in PHP onSeptember 06, 2014

无刷新文件上传是一个常见而又有点复杂的问题,常见的解决方案是构造 iframe 方式实现。

在 HTML5 中提供了一个 FormData 对象 API,通过 FormData 可以方便地构造一个表单请求,并通过 XMLHttpRequest 来发送。通过 FormData 对象发送文件也是可以的,如此则无刷新上传就变的非常简单了。

那么 FormData 怎么使用呢?下面三水点靠木对此进行简单的介绍。

1. 构造 FormData 对象

想得到一个FormData对象,很简单:

var fd = new FormData();

FormData 对象只提供了一个方法 append ,用于向对象中添加表单请求参数。
在当前主流浏览器中,可通过如下两种方式获取或修改FormData。
方法一:创建一个空的FormData对象,然后再用append方法逐个添加键值对。示例:

var fd = new FormData();
fd.append("name", "三水点靠木");
fd.append("blog", "http://3water.com");
fd.append("file", document.getElementById("file"));

这种方法可以不需要 HTML 的表单对象存在。
方法二:取得form元素对象,将它作为参数传入FormData对象中。示例:

var formobj = document.getElementById("form");
var fd = new FormData(formobj);

当然,这里还可以使用 append 方法继续向 fd 中添加其他参数。

2. FormData 发送请求

得到 FormData 对象了,如何发送请求呢? FormData 对象主要用于增强型的 XMLHttpRequest 对象的 send 方法中。参考如下示例:

var xhr = new XMLHttpRequest();    
xhr.open("POST" ,"http://3water.com" , true);
xhr.send(fd);
xhr.onload = function(e) {
  if (this.status == 200) {
    alert(this.responseText);
  }
};

3. jquery 中使用 FormData

在 jQuery 的 ajax 方法中,也可使用 FormData 方式实现无刷新上传。但要注意参数的设置,参考如下:

$.ajax({
  url: "http://3water.com",
  type: 'POST',
  data: fd,
  /**
   *必须false才会自动加上正确的Content-Type
   */
  contentType:false,
  /**
   * 必须false才会避开jQuery对 formdata 的默认处理
   * XMLHttpRequest会对 formdata 进行正确的处理
   */
  processData:false
}).done(function(result){
  console.log(result);
}).fail(function(err){
  console.log(err);
});

4. 一个完整的示例(包含PHP处理示例):

<?php
//php 接收表单提交信息并打印
if( isset( $_REQUEST['do']) ){
  var_dump($_REQUEST);
  var_dump($_FILES);
  die();
}

?>
<!DOCTYPE HTML>
<html>
  <head>
    <meta charset="utf-8">
    <title>FormData Test - 3water.com</title>
    <script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
  </head>
  <body>
    <form id="form">
      <input type="file" name="file" id="file" />
      <input type="text" name="name" id="" value="三水点靠木" />
      <input type="text" name="blog" id="" value="http://3water.com" />
      <input type="submit" name="do" id="do" value="submit" />
    </form>
    <script>
    $("form").submit(function(e){
      e.preventDefault();
      
      //空对象然后添加
      var fd = new FormData();
      fd.append("name", "三水点靠木");
      fd.append("blog", "http://3water.com");
      fd.append("file", document.getElementById("file"));
      //fd.append("file", $(":file")[0].files[0]); //jQuery 方式
      fd.append("do", "submit");
      
      //通过表单对象创建 FormData
      var fd = new FormData(document.getElementById("form"));
      //var fd = new FormData($("form:eq(0)")[0]); //jquery 方式
      
      //XMLHttpRequest 原生方式发送请求
      var xhr = new XMLHttpRequest();    
      xhr.open("POST" ,"" , true);
      xhr.send(fd);
      xhr.onload = function(e) {
        if (this.status == 200) {
          alert(this.responseText);
        };
      };
      return;
      //jQuery 方式发送请求
      $.ajax({
        type:"post",
        //url:"",
        data: fd,
        processData: false,
        contentType: false
      }).done(function(res){
        console.log(res);
      });
      
      return false;
    });
    </script>
  </body>
</html>
PHP 相关文章推荐
PHP中调用JAVA
Oct 09 PHP
php入门学习知识点六 PHP文件的读写操作代码
Jul 14 PHP
一个好用的PHP验证码类实例分享
Dec 27 PHP
使用php方法curl抓取AJAX异步内容思路分析及代码分享
Aug 25 PHP
一个经典实用的PHP图像处理类分享
Nov 18 PHP
smarty简单入门实例
Nov 28 PHP
PHP实现HTML页面静态化的方法
Nov 04 PHP
详解PHP5.6.30与Apache2.4.x配置
Jun 02 PHP
PHP laravel中的多对多关系实例详解
Jun 07 PHP
Laravel 批量更新多条数据的示例
Nov 27 PHP
总结PHP内存释放以及垃圾回收
Mar 29 PHP
laravel框架使用FormRequest进行表单验证,验证异常返回JSON操作示例
Feb 18 PHP
Windows下的PHP 5.3.x安装 Zend Guard Loader教程
Sep 06 #PHP
php获取一个变量的名字的方法
Sep 05 #PHP
Yii使用find findAll查找出指定字段的实现方法
Sep 05 #PHP
如何让thinkphp在模型中自动完成session赋值小教程
Sep 05 #PHP
php清空(删除)指定目录下的文件,不删除目录文件夹的实现代码
Sep 04 #PHP
Chrome Web App开发小结
Sep 04 #PHP
Yii查询生成器(Query Builder)用法实例教程
Sep 04 #PHP
You might like
索尼SONY ICF-7600A(W)电路分析
2021/03/01 无线电
奉献出一个封装的curl函数 便于调用(抓数据专用)
2013/07/22 PHP
php导出csv格式数据并将数字转换成文本的思路以及代码分享
2014/06/05 PHP
php的mssql数据库连接类实例
2014/11/28 PHP
PHP中的事务使用实例
2015/05/26 PHP
js 动态文字滚动的例子
2011/01/17 Javascript
javascript面向对象之二 命名空间
2011/02/08 Javascript
判断复选框是否被选中的两种方法
2014/06/04 Javascript
AngularJS模块学习之Anchor Scroll
2016/01/19 Javascript
jQuery 中的 DOM 操作
2016/04/26 Javascript
Web性能优化系列 10个提升JavaScript性能的技巧
2016/09/27 Javascript
js实现下拉框效果(select)
2017/03/28 Javascript
jquery中ajax请求后台数据成功后既不执行success也不执行error的完美解决方法
2017/12/24 jQuery
Vuejs+vue-router打包+Nginx配置的实例
2018/09/20 Javascript
jQuery+css last-child实现选择最后一个子元素操作示例
2018/12/10 jQuery
js脚本中执行java后台代码方法解析
2019/10/11 Javascript
Vue使用富文本编辑器Vue-Quill-Editor(含图片自定义上传服务、清除复制粘贴样式等)
2020/05/15 Javascript
koa中间件核心(koa-compose)源码解读分析
2020/06/15 Javascript
[02:55]2018DOTA2国际邀请赛勇士令状不朽珍藏Ⅲ饰品一览
2018/08/01 DOTA
kNN算法python实现和简单数字识别的方法
2014/11/18 Python
python自动zip压缩目录的方法
2015/06/28 Python
对python 自定义协议的方法详解
2019/02/13 Python
pytorch 指定gpu训练与多gpu并行训练示例
2019/12/31 Python
Python运行异常管理解决方案
2020/03/09 Python
快速解决jupyter启动卡死的问题
2020/04/10 Python
澳大利亚领先的运动鞋商店:Hype DC
2018/03/31 全球购物
自主招生自荐信格式
2013/12/03 职场文书
回门宴新郎答谢词
2014/01/12 职场文书
我读书我快乐演讲稿
2014/05/07 职场文书
软件售后服务承诺书
2014/05/21 职场文书
赔偿协议书怎么写
2015/01/28 职场文书
自荐信格式模板
2015/03/27 职场文书
行政人事专员岗位职责
2015/04/07 职场文书
2016党员学习作风建设心得体会
2016/01/21 职场文书
python中如何对多变量连续赋值
2021/06/03 Python
Python Django模型详解
2021/10/05 Python