使用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中处理模拟rewrite 效果
Dec 09 PHP
php 空格,换行,跳格使用说明
Dec 18 PHP
php高级编程-函数-郑阿奇
Jul 04 PHP
php.ini修改php上传文件大小限制的方法详解
Jun 17 PHP
php将url地址转化为完整的a标签链接代码(php为url地址添加a标签)
Jan 17 PHP
PHP中Header使用的HTTP协议及常用方法小结
Nov 04 PHP
php支付宝接口用法分析
Jan 04 PHP
分享一个Laravel好用的Cache宏
Mar 02 PHP
PHP数组和explode函数示例总结
May 08 PHP
php防止sql注入的方法详解
Feb 20 PHP
PHP完全二叉树定义与实现方法示例
Oct 09 PHP
Laravel实现ORM带条件搜索分页
Oct 24 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中实现汉字转区位码应用源码实例解析
2010/06/14 PHP
字母顺序颠倒而单词顺序不变的php代码
2010/08/08 PHP
支付宝接口开发集成支付环境小结
2015/03/17 PHP
php is_writable判断文件是否可写实例代码
2016/10/13 PHP
PHP实现的简单适配器模式示例
2017/06/22 PHP
PHP生成(支持多模板)二维码海报代码
2018/04/30 PHP
javascript中使用replaceAll()函数实现字符替换的方法
2010/12/25 Javascript
JS与C#编码解码
2013/12/03 Javascript
JS获取几种URL地址的方法小结
2014/02/26 Javascript
Augularjs-起步详解
2016/07/08 Javascript
javascript中使用未定义变量或值的情况分析
2016/07/19 Javascript
微信小程序 定位到当前城市实现实例代码
2017/02/23 Javascript
JS实现含有中文字符串的友好截取功能分析
2017/03/13 Javascript
VUE实现可随意拖动的弹窗组件
2018/09/25 Javascript
VueJS实现用户管理系统
2020/05/29 Javascript
python 自动重连wifi windows的方法
2018/12/18 Python
对python指数、幂数拟合curve_fit详解
2018/12/29 Python
通过PYTHON来实现图像分割详解
2019/06/26 Python
Python操作列表常用方法实例小结【创建、遍历、统计、切片等】
2019/10/25 Python
python 实现二维列表转置
2019/12/02 Python
Python Django中的STATIC_URL 设置和使用方式
2020/03/27 Python
Python读取Excel一列并计算所有对象出现次数的方法
2020/09/04 Python
HEMA英国:荷兰原创设计
2018/08/28 全球购物
武汉瑞得软件笔试题
2015/10/27 面试题
2014年学习厉行节约反对浪费思想汇报
2014/09/10 职场文书
防火标语大全
2014/10/06 职场文书
订货会邀请函
2015/01/31 职场文书
员工手册编写范本
2015/05/14 职场文书
民事二审代理词
2015/05/25 职场文书
2015年党建工作汇报材料
2015/06/25 职场文书
乡镇干部学习心得体会
2016/01/23 职场文书
《揠苗助长》教学反思
2016/02/20 职场文书
Vue中插槽slot的使用方法与应用场景详析
2021/06/08 Vue.js
Element实现动态表格的示例代码
2021/08/02 Javascript
Redis批量生成数据的实现
2022/06/05 Redis
Redis+AOP+自定义注解实现限流
2022/06/28 Redis