使用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相关资料
Oct 09 PHP
php 验证码制作(网树注释思想)
Jul 20 PHP
PHP中的strtr函数使用介绍(str_replace)
Oct 20 PHP
ajax完美实现两个网页 分页功能的实例代码
Apr 16 PHP
基于python发送邮件的乱码问题的解决办法
Apr 25 PHP
php session劫持和防范的方法
Nov 12 PHP
php switch语句多个值匹配同一代码块的实现
Mar 03 PHP
php中3种方法删除字符串中间的空格
Mar 10 PHP
php中namespace use用法实例分析
Jan 22 PHP
php编程实现简单的网页版计算器功能示例
Apr 26 PHP
php魔法函数与魔法常量使用介绍
Jul 23 PHP
Laravel配置全局公共函数的方法步骤
May 09 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
第十节--抽象方法和抽象类
2006/11/16 PHP
PHP生成验证码时“图像因其本身有错无法显示”的解决方法
2013/08/07 PHP
基于php实现的php代码加密解密类完整实例
2016/10/12 PHP
php使用ftp实现文件上传与下载功能
2017/07/21 PHP
php 提交表单 关闭layer弹窗iframe的实例讲解
2018/08/20 PHP
PHP PDOStatement::getAttribute讲解
2019/02/01 PHP
php 使用 __call实现重载功能示例
2019/11/18 PHP
使用EXT实现无刷新动态调用股票信息
2008/11/01 Javascript
Javascript insertAfter() 实现函数代码
2011/10/12 Javascript
实例讲解JS中数组Array的操作方法
2014/05/09 Javascript
JS简单实现tab切换效果的多窗口显示功能
2016/09/07 Javascript
详解XMLHttpRequest(二)响应属性、二进制数据、监测上传下载进度
2016/09/14 Javascript
JS设置随机出现2个数字的实例代码
2017/07/19 Javascript
React BootStrap用户体验框架快速上手
2018/03/06 Javascript
vue组件挂载到全局方法的示例代码
2018/08/02 Javascript
vue中动态添加class类名的方法
2018/09/05 Javascript
vue-form表单验证是否为空值的实例详解
2019/10/29 Javascript
浅析JS中NEW的实现原理及重写
2020/02/20 Javascript
JS浏览器BOM常见操作实例详解
2020/04/27 Javascript
[04:32]玩具屠夫中文语音节选
2020/08/23 DOTA
浅谈Python中copy()方法的使用
2015/05/21 Python
在Python的Django框架中编写错误提示页面
2015/07/22 Python
python实现稀疏矩阵示例代码
2017/06/09 Python
win7下python3.6安装配置方法图文教程
2018/07/31 Python
解决pycharm运行出错,代码正确结果不显示的问题
2018/11/30 Python
解决.ui文件生成的.py文件运行不出现界面的方法
2019/06/19 Python
使用css3和jquery实现可伸缩搜索框
2014/02/12 HTML / CSS
HTML5不支持标签和新增标签详解
2016/06/27 HTML / CSS
Html5饼图绘制实现统计图的方法
2020/08/05 HTML / CSS
中国综合网上购物商城:苏宁易购
2016/08/09 全球购物
世界上最好的儿童品牌:AlexandAlexa
2018/01/27 全球购物
Bogner美国官网:滑雪服中的”Dior”
2018/01/30 全球购物
电信专业毕业生推荐信
2013/11/18 职场文书
自荐书4要点
2014/01/25 职场文书
新闻编辑专业毕业自荐书范文
2014/02/05 职场文书
win10如何快速切换窗口 win10切换窗口快捷键分享
2022/07/23 数码科技