FormData对象能让你生成一系列用于XMLHttpRequest发送的键值对。它主要的目的在于发送表单数据,但也能独立用于传输有键形式的数据。其传输的数据格式和表单使用submit()方法、且编码类型为multipart/form-data所发送的数据格式相同。

从头开始创建一个FormData对象

你可以自己建立一个FormData对象,首先进行实例化、再通过apppend()方法来添加字段,如下所示:

  1. var formData = new FormData();
  2. formData.append("username", "Groucho");
  3. formData.append("accountnum", 123456); // 数字123456会自动转为字符串"123456"
  4. // 用户选择的HTML的文件提交
  5. formData.append("userfile", fileInputElement.files[0]);
  6. // JavaScript的类文件对象(Blob)
  7. var content = '<a id="a"><b id="b">hey!</b></a>'; // 新文件的主体
  8. var blob = new Blob([content], { type: "text/xml"});
  9. formData.append("webmasterfile", blob);
  10. var request = new XMLHttpRequest();
  11. request.open("POST", "http://foo.com/submitform.php");
  12. request.send(formData);

注意:“userfile”字段和“webmasterfile”字段都包含了文件。“accountnum”字段中的数字会自动被FormData.append()方法自动转为字符串。(字段值可以是一个BlobFile或字符串,若值不是Blob、File之一,就会被转为字符串

上面的例子建立了一个包含名为“username”、“accountnum”、“userfile”和“webmasterfile”字段的FormData对象。然后使用了XMLHttpRequest的send()方法来发送表单数据。“webmasterfile”字段是个Blob对象,该对象代表了一个由不可变的、原始数据组成的类文件对象,里面的的数据不必使用JavaScript的原生数据类型。File对象也是基于Blob对象的,它继承了Blob的基本功能并做了拓展以支持用户操作系统上的文件。要建立一个Blob对象,你可以使用Blob构造函数

用HTML表单中创建一个FormData对象

要用现有的<form>元素建立一个FormData对象,可以在建立FormData对象时传入指定的<form>元素。

  1. var formData = new FormData(someFormElement);

举个例子:

  1. var formElement = document.querySelector("form");
  2. var request = new XMLHttpRequest();
  3. request.open("POST", "submitform.php");
  4. request.send(new FormData(formElement));

在用<form>元素建立FromData对象之后、发送它之前,也可以给它添加额外的数据,如下:

  1. var formElement = document.querySelector("form");
  2. var formData = new FormData(formElement);
  3. var request = new XMLHttpRequest();
  4. request.open("POST", "submitform.php");
  5. formData.append("serialnumber", serialNumber++);
  6. request.send(formData);

这样一来我们就能在发送表单数据前进行配置,以添加一些不需用户编辑的信息。

用FormData对象发送文件

你也可以用FormData对象发送文件,只需在你的<form>标签间包含一个file类型的<input>元素:

  1. <form enctype="multipart/form-data" method="post" name="fileinfo">
  2. <label>Your email address:</label>
  3. <input type="email" autocomplete="on" autofocus name="userid" placeholder="email" required size="32" maxlength="64" /><br />
  4. <label>Custom file label:</label>
  5. <input type="text" name="filelabel" size="12" maxlength="32" /><br />
  6. <label>File to stash:</label>
  7. <input type="file" name="file" required />
  8. <input type="submit" value="Stash the file!" />
  9. </form>
  10. <div></div>

然后你就能用如下代码发送文件了:

  1. var form = document.forms.namedItem("fileinfo");
  2. form.addEventListener('submit', function(ev) {
  3. var oOutput = document.querySelector("div"),
  4. oData = new FormData(form);
  5. oData.append("CustomField", "This is some extra data");
  6. var oReq = new XMLHttpRequest();
  7. oReq.open("POST", "stash.php", true);
  8. oReq.onload = function(oEvent) {
  9. if (oReq.status == 200) {
  10. oOutput.innerHTML = "Uploaded!";
  11. } else {
  12. oOutput.innerHTML = "Error " + oReq.status + " occurred when trying to upload your file.<br \/>";
  13. }
  14. };
  15. oReq.send(oData);
  16. ev.preventDefault();
  17. }, false);

注意:若你传入了一个表单的引用,那么表单指定的方法(译注:应指Post、Get)会覆盖open()方法调用时指定的。

你也可以直接添加File或Blob到FormData对象,如下:

  1. data.append("myfile", myBlob, "filename.txt");

使用append()方法时,使用第三个可选的参数会指定一个文件名,用于请求头的Content-Disposition字段。若没有指定文件名(或者该参数不被支持),那就默认使用“blob”这个名字。

通过AJAX提交表单和发送文件而不使用FormData对象

若你想了解如何基于AJAX进行序列化和发送表单操作,而不使用FormData对象,可阅读此文

参见

Using XMLHttpRequest
HTMLFormElement
Blob
Typed Arrays

【译】使用FormData对象的更多相关文章

  1. 通过Ajax使用FormData对象无刷新上传文件

    写在前面:本文说的这个方案有浏览器兼容性问题:所有主流浏览器的较新版本已经支持这个对象了,比如Chrome 7+.Firefox 4+.IE 10+.Opera 12+.Safari 5+,对兼容性比 ...

  2. H5 FormData对象的使用

    XMLHttpRequest Level2 添加了一个新的接口--FormData .[ 主要用于发送表单数据,但也可以独立使用于传输键控数据.与普通的Ajax相比,它能异步上传二进制文件 ] 利用F ...

  3. html5的FormData对象和input的file属性以及window.URL.createObjectURL( ) 方法(转载)

    /** FormData ==>表单数据 能自动把表单数据拼接打包 当ajax发送数据时,发送打包的数据; 还可以使用FormData对象的append(key,value)添加数据 FormD ...

  4. HTML的FormData对象

    FormData是HTML5标准制定的一个新的封装对象,有了FormData对象,可以方便地通过javascript创建表单数据,直接以ajax发送到服务器中. 目前浏览器的支持情况为: 详细的介绍与 ...

  5. 通过jQuery Ajax使用FormData对象上传文件

    FormData对象,是可以使用一系列的键值对来模拟一个完整的表单,然后使用XMLHttpRequest发送这个"表单". 在 Mozilla Developer 网站 使用For ...

  6. FormData对象

    FF4中增加了一个很有意思的对象,FormData.通常我们提交(使用submit button)时,会把form中的所有表格元素的name与value组成一个queryString,提交到后台.这用 ...

  7. Ajax发送FormData对象封装的表单数据

    前端页面: <!doctype html> <html lang="en"> <head> <meta charset="UTF ...

  8. 使用JS的FormData对象

    利用FormData对象,你可以使用一系列的键值对来模拟一个完整的表单,然后使用XMLHttpRequest发送这个"表单". 创建一个FormData对象 你可以先创建一个空的F ...

  9. FormData+Ajax 实现多文件上传 学习使用FormData对象

    FormData对象是为序列化表以及创建与表单格式相同的数据(当然是用于XHR传输)提供便利. 今天我们使用dropzone和FormData实现多文件上传功能. var SAMP = null; / ...

随机推荐

  1. 七种常见经典排序算法总结(C++实现)

    排序算法是非常常见也非常基础的算法,以至于大部分情况下它们都被集成到了语言的辅助库中.排序算法虽然已经可以很方便的使用,但是理解排序算法可以帮助我们找到解题的方向. 1. 冒泡排序 (Bubble S ...

  2. C# 关闭登录窗体,显示主窗体

    首先在programm.cs里设置登录窗体显示 static class Program    {        /// <summary>        /// The main ent ...

  3. mysql之左连接、右连接、内连接、全连接、等值连接、交叉连接等

    mysql中的各种jion的记录,以备用时查 1.等值连接和内连接, a.内连接与等值连接效果是相同的,执行效率也相同,只是书写方式不一样,内连接是由SQL 1999规则定的书写方式 比如: sele ...

  4. html lang="en"

    <html lang="en">向搜索引擎表示该页面是html语言,并且语言为英文网站,其"lang"的意思就是“language”,语言的意思,而 ...

  5. BZOJ 2318: Spoj4060 game with probability Problem (概率dp)(博弈论)

    2318: Spoj4060 game with probability Problem Description Alice和Bob在玩一个游戏.有n个石子在这里,Alice和Bob轮流投掷硬币,如果 ...

  6. 3.redis kyes命令

    Keys命令 1.1设置key的生存时间 Redis在实际使用过程中更多的用作缓存,然而缓存的数据一般都是需要设置生存时间的,即:到期后数据销毁. EXPIRE key seconds         ...

  7. synchronized互斥锁实例解析

    目录 synchronized互斥锁实例解析 1.互斥锁基础使用:防止多个线程同时访问对象的synchronized方法. 1.1.多个线程调用同一个方法 1.2.多个线程多个锁,升级为类锁 2.线程 ...

  8. 从Surface 3发布 看微软快速转向的根由

    3发布 看微软快速转向的根由" title="从Surface 3发布 看微软快速转向的根由"> 平地一声惊雷起,微软突然送惊喜!在毫无征兆的情况下,微软突然发布一 ...

  9. 题解:BZOJ 1009 HNOI2008 GT考试 KMP + 矩阵

    原题描述: 阿申准备报名参加GT考试,准考证号为N位数 X1X2....Xn(0<=Xi<=9),他不希望准考证号上出现不吉利的数字.他的不吉利数学A1A2...Am(0<=Ai&a ...

  10. IOS下的safari下localStorage不起作用的问题

    我们的一个小应用,使用百度地图API获取到用户的坐标之后用localStorage做了下缓存,测试上线之后有运营同学反馈页面数据拉取不到, 测试的时候没有发现问题,而且2台相同的iphone一台可以一 ...