注:formData中的数据在控制台上的console里面是打印不出来的,只能在控制台的network里面查看到具体的发送数据和发送选项

文章出处:梦想天空

XMLHttpRequest Level 2 添加了一个新的接口——FormData利用 FormData 对象,我们可以通过 JavaScript 用一些键值对来模拟一系列表单控件,我们还可以使用 XMLHttpRequest 的 send() 方法来异步的提交表单。与普通的 Ajax 相比,使用 FormData 的最大优点就是我们可以异步上传二进制文件。

您可能感兴趣的相关文章
  • 10大流行 Metro UI Bootstrap 主题和模板
  • 精选12款优秀 jQuery Ajax 分页插件和教程
  • 10大流行的 Metro UI 风格 Bootstrap 主题
  • 8款效果精美的 jQuery 加载动画和进度条插件
  • 推荐35款精致的 CSS3 和 HTML5 网页模板

创建一个FormData对象

  你可以先创建一个空的 FormData 对象,然后使用 append() 方法向该对象里添加字段,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var oMyForm = new FormData();
oMyForm.append("username""Groucho");
oMyForm.append("accountnum", 123456); // 数字123456被立即转换成字符串"123456"
// fileInputElement中已经包含了用户所选择的文件
oMyForm.append("userfile", fileInputElement.files[0]);
var oFileBody = "<a id="a"><b id="b">hey!</b></a>"// Blob对象包含的文件内容
var oBlob = new Blob([oFileBody], { type: "text/xml"});
oMyForm.append("webmasterfile", oBlob);
var oReq = new XMLHttpRequest();
oReq.open("POST""http://foo.com/submitform.php");
oReq.send(oMyForm);

  注:字段 "userfile" 和 "webmasterfile" 的值都包含了一个文件。通过 FormData.append() 方法赋给字段 "accountnum" 的数字被自动转换为字符(字段的值可以是一个 Blob 对象,File对象或者字符串,剩下其他类型的值都会被自动转换成字符串)。

  在该例子中,我们创建了一个名为 oMyForm 的 FormData 对象,该对象中包含了名为"username","accountnum","userfile" 以及 "webmasterfile" 的字段名,然后使用XMLHttpRequest的 send() 方法把这些数据发送了出去。"webmasterfile" 字段的值不是一个字符串,还是一个 Blob 对象。

使用HTML表单来初始化一个FormData对象

  可以用一个已有的 form 元素来初始化 FormData 对象,只需要把这个 form 元素作为参数传入 FormData 构造函数即可:

1
var newFormData = new FormData(someFormElement);

  例如:

1
2
3
4
var formElement = document.getElementById("myFormElement");
var oReq = new XMLHttpRequest();
oReq.open("POST""submitform.php");
oReq.send(new FormData(formElement));

  你还可以在已有表单数据的基础上,继续添加新的键值对,如下:

1
2
3
4
var formElement = document.getElementById("myFormElement");
formData = new FormData(formElement);
formData.append("serialnumber", serialNumber++);
oReq.send(formData);

  你可以通过这种方式添加一些不想让用户编辑的固定字段,然后再发送.

使用FormData对象发送文件

  你还可以使用 FormData 来发送二进制文件.首先在 HTML 中要有一个包含了文件输入框的 form 元素:

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

  然后你就可以使用下面的代码来异步的上传用户所选择的文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function sendForm() {
  var oOutput = document.getElementById("output");
  var oData = new FormData(document.forms.namedItem("fileinfo"));
  oData.append("CustomField""This is some extra data");
  var oReq = new XMLHttpRequest();
  oReq.open("POST""stash.php"true);
  oReq.onload = function(oEvent) {
    if (oReq.status == 200) {
      oOutput.innerHTML = "Uploaded!";
    else {
      oOutput.innerHTML = "Error " + oReq.status + " occurred uploading your file.<br \/>";
    }
  };
  oReq.send(oData);
}

  你还可以不借助 HTML 表单,直接向 FormData 对象中添加一个 File 对象或者一个 Blob 对象:

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

  如果 FormData 对象中的某个字段值是一个 Blob 对象,则在发送 HTTP 请求时,代表该 Blob 对象所包含文件的文件名的 "Content-Disposition" 请求头的值在不同的浏览器下有所不同,Firefox使用了固定的字符串"blob",而 Chrome 使用了一个随机字符串。

  你还可以使用 jQuery 来发送 FormData,但必须要正确的设置相关选项:

1
2
3
4
5
6
7
8
9
var fd = new FormData(document.getElementById("fileinfo"));
fd.append("CustomField""This is some extra data");
$.ajax({
  url: "stash.php",
  type: "POST",
  data: fd,
  processData: false,  // 告诉jQuery不要去处理发送的数据
  contentType: false   // 告诉jQuery不要去设置Content-Type请求头
});

浏览器兼容性

  桌面端:

Feature Chrome Firefox (Gecko) Internet Explorer Opera Safari
Basic support 7+ 4.0 (2.0) 10+ 12+ 5+
支持filename参数 (Yes) 22.0 (22.0) ? ? ?

  移动端:

Feature Android Chrome for Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
Basic support 3.0 ? 4.0 (2.0) ?

12+

?
支持filename参数 ? ? 22.0 (22.0) ? ? ?

参考文献:

  • MDN:使用 XMLHttpRequest
  • MDN:XMLHttpRequest FormData
  • XMLHttpRequest 2 新技巧
  • MDN:使用 FormData 对象
  • W3C:XMLHttpRequest Level 2

转载于:https://www.cnblogs.com/MonaSong/p/5955950.html

HTML5笔记——formData相关推荐

  1. html5 上传 原理,浅谈使用HTML5的FormData上传文件原理!!!

    [书山有路勤为径,学海无涯苦作舟] //一.FormData背景介绍 //表单提交,文件上传是一个常用又十分麻烦的功能,以前要上传文件通常都是借助插件或者flash来实现,噼里啪啦的加载一大堆东西.自 ...

  2. PHP结合HTML5使用FormData对象提交表单及上传图片

    FormData 对象,可以把form中所有表单元素的name与value组成一个queryString,提交到后台.在使用Ajax提交时,使用FormData对象可以减少拼接queryString的 ...

  3. php form 上传_php+html5使用FormData对象提交表单及上传图片的方法

    本文实例讲述了php+html5使用FormData对象提交表单及上传图片的方法.分享给大家供大家参考.具体分析如下: FormData 对象,可以把form中所有表单元素的name与value组成一 ...

  4. HTML5笔记+案例

    HTML笔记 文件扩展名 Word.docx Excel.xlsx PPT.pptx 打开文件扩展名的方法: 或者: 一 . html简介 1.HTML是什么? HTML:Hyper Text Mar ...

  5. HTML5笔记加案例

    软件安装篇 1.记笔记工具----typroa 文件名:基本文件名.扩展名 ​ eg:SDN.docx 用word打开 ​ 销售统计表.xlsx 用excel打开 2.截图工具的安装 Greensho ...

  6. HTML5笔记案例结合

    预备内容: 软件安装 1.安装笔记工具----typroa 文件名:基本文件名.扩展名 2,截图工具安装 3,sublimes----无需安 装 解压 将解压后的文件剪切到C盘 创建桌面快捷方式# H ...

  7. php 下 html5 XHR2 + FormData + File API 上传文件

    FormData的作用: FormData对象可以帮助我们自动的打包表单数据,通过XMLHttpRequest的send()方法来提交表单.当然FormData也可以动态的append数据.FormD ...

  8. HTML5笔记(菜鸟教程)

    写了一篇笔记了,觉得整个页面效果乱乱的,这篇文章就再改变一下试一下小节加粗康康有没有好一点.最近希望自己学习效率可以高一点再高一点,最近网课上的我负能量满满这样不好不好.不知道大家写博客的时候用的是M ...

  9. HTML5.笔记.案例

    HTML 一 . html简介 1.HTML是什么? HTML:hyper text makrup language超文本标记(标签)语言由各种标签组成,用来制作网页,告诉浏览器该如何显示页面 2.作 ...

最新文章

  1. 卷积神经网络的“封神之路
  2. PAT甲级1036 Boys vs Girls:[C++题解] 字符串处理
  3. oracle回收ddl权限,oracle禁止指定用户DDL操作触发器
  4. 在使用Cocos2d-JS 开发过程中需要用到的单体设计模式
  5. Django学习笔记第三篇--关于响应返回
  6. 倒计时1天,BDTC2016最新完整版日程公布
  7. 在PyCharm下使用Jupyter Notebook
  8. 40个问题让你快速掌握Java多线程的精髓
  9. Tomcat 配置虚拟目录
  10. php arraymap 匿名函数,结合代码详细为你讲解,php中的array_map,array_walk以及匿名函数...
  11. DllRegisterServer调用失败的解决办法
  12. Emmagee性能测试小工具
  13. coreldraw教程入门零基础coreldraw下载coreldraw2019安装
  14. 华为云学院-人人学loT学习笔记- 第五章 操作系统 轻量开源
  15. Java 进阶 hello world! - 中级程序员之路
  16. Google服务器架构图解简析
  17. burp suite爆破模式操作心得
  18. linux删除文件夹(里面有文件)
  19. python和java对接数据的简单实现
  20. Java 实现sha_Java实现SHA-1算法实例

热门文章

  1. Yandex.Algorithm 2011 Round 2 D. Powerful array 莫队
  2. Linux crontab定时执行任务
  3. 关于图连通性的几道题(水)
  4. xshell最多支持4个_中集拉钢卷专用挂车来了!自重5吨,最多能装4个钢卷
  5. matlab 图像坐标系
  6. ubuntu 编译mysql_Ubuntu编译MySQL5
  7. 汽车电子专业知识篇(三十二)-整车电控系统及架构设计技术
  8. 机器学习算法应用30篇(十一)-理解逻辑回归及二分类、多分类代码实践
  9. AUTOSAR从入门到精通番外篇(二)-一文读懂ld链接脚本文件
  10. 江西住建云实名认证怎么弄_王者荣耀无限时间怎么弄 2020年无限时间账号