使用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 相关文章推荐
PHP5 面向对象程序设计
Feb 13 PHP
PHP开发过程中常用函数收藏
Dec 14 PHP
PHP大批量数据操作时临时调整内存与执行时间的方法
Apr 20 PHP
PHP排序之二维数组的按照字母排序实现代码
Aug 13 PHP
PHP数组 为文章加关键字连接 文章内容自动加链接
Dec 29 PHP
php更新mysql后获取影响的行数发生异常解决方法
Mar 28 PHP
解析左右值无限分类的实现算法
Jun 20 PHP
PHP实现货币换算的方法
Nov 29 PHP
php操作xml入门之cdata区段
Jan 23 PHP
用PHP代码给图片加水印
Jul 01 PHP
为你总结一些php系统类函数
Oct 21 PHP
如何使用GDB调试PHP程序
Dec 08 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
php截取utf-8中文字符串乱码的解决方法
2010/03/29 PHP
解析PHP的session过期设置
2013/06/29 PHP
php json转换成数组形式代码分享
2014/11/10 PHP
PHP中的traits实现代码复用使用实例
2015/05/13 PHP
PHP版单点登陆实现方案的实例
2016/11/17 PHP
Alliance vs Liquid BO3 第三场2.13
2021/03/10 DOTA
Javascript图像处理—为矩阵添加常用方法
2012/12/27 Javascript
UpdatePanel和Jquery冲突的解决方法
2013/04/01 Javascript
JQuery.get提交页面不跳转的解决方法
2015/01/13 Javascript
基于javascript实现九九乘法表
2016/03/27 Javascript
angularjs select 赋值 ng-options配置方法
2018/02/28 Javascript
微信小程序实现带参数的分享功能(两种方法)
2019/05/17 Javascript
javascript中的数据类型检测方法详解
2019/08/07 Javascript
实例Python处理XML文件的方法
2015/08/31 Python
Python检测网络延迟的代码
2018/05/15 Python
Python + selenium自动化环境搭建的完整步骤
2018/05/19 Python
Python 实现自动导入缺失的库
2019/10/29 Python
Python如何读取文件中图片格式
2020/01/13 Python
Python pandas对excel的操作实现示例
2020/07/21 Python
python 服务器运行代码报错ModuleNotFoundError的解决办法
2020/09/16 Python
python解包概念及实例
2021/02/17 Python
自荐信包含哪些内容
2013/10/30 职场文书
卫校中专生的自我评价
2014/01/15 职场文书
文科教师毕业的自我评价
2014/01/16 职场文书
酒店副总经理岗位职责范本
2014/02/04 职场文书
五年级科学教学反思
2014/02/05 职场文书
餐饮收银员岗位职责
2014/02/07 职场文书
小学生家长评语大全
2014/02/10 职场文书
公司行政专员岗位职责
2014/08/24 职场文书
优秀教育工作者事迹材料
2014/12/24 职场文书
施工单位工程部经理岗位职责
2015/04/09 职场文书
监理中标通知书
2015/04/16 职场文书
时尚女魔头观后感
2015/06/04 职场文书
幼儿园体操比赛口号
2015/12/25 职场文书
spring cloud 配置中心客户端启动遇到的问题
2021/09/25 Java/Android
了解MySQL查询语句执行过程(5大组件)
2022/08/14 MySQL