【译】使用FormData对象
FormData对象能让你生成一系列用于XMLHttpRequest发送的键值对。它主要的目的在于发送表单数据,但也能独立用于传输有键形式的数据。其传输的数据格式和表单使用submit()方法、且编码类型为multipart/form-data所发送的数据格式相同。
从头开始创建一个FormData对象
你可以自己建立一个FormData对象,首先进行实例化、再通过apppend()方法来添加字段,如下所示:
var formData = new FormData();
formData.append("username", "Groucho");
formData.append("accountnum", 123456); // 数字123456会自动转为字符串"123456"
// 用户选择的HTML的文件提交
formData.append("userfile", fileInputElement.files[0]);
// JavaScript的类文件对象(Blob)
var content = '<a id="a"><b id="b">hey!</b></a>'; // 新文件的主体
var blob = new Blob([content], { type: "text/xml"});
formData.append("webmasterfile", blob);
var request = new XMLHttpRequest();
request.open("POST", "http://foo.com/submitform.php");
request.send(formData);
注意:“userfile”字段和“webmasterfile”字段都包含了文件。“accountnum”字段中的数字会自动被FormData.append()方法自动转为字符串。(字段值可以是一个Blob、File或字符串,若值不是Blob、File之一,就会被转为字符串)
上面的例子建立了一个包含名为“username”、“accountnum”、“userfile”和“webmasterfile”字段的FormData对象。然后使用了XMLHttpRequest的send()方法来发送表单数据。“webmasterfile”字段是个Blob对象,该对象代表了一个由不可变的、原始数据组成的类文件对象,里面的的数据不必使用JavaScript的原生数据类型。File对象也是基于Blob对象的,它继承了Blob的基本功能并做了拓展以支持用户操作系统上的文件。要建立一个Blob对象,你可以使用Blob构造函数。
用HTML表单中创建一个FormData对象
要用现有的<form>元素建立一个FormData对象,可以在建立FormData对象时传入指定的<form>元素。
var formData = new FormData(someFormElement);
举个例子:
var formElement = document.querySelector("form");
var request = new XMLHttpRequest();
request.open("POST", "submitform.php");
request.send(new FormData(formElement));
在用<form>元素建立FromData对象之后、发送它之前,也可以给它添加额外的数据,如下:
var formElement = document.querySelector("form");
var formData = new FormData(formElement);
var request = new XMLHttpRequest();
request.open("POST", "submitform.php");
formData.append("serialnumber", serialNumber++);
request.send(formData);
这样一来我们就能在发送表单数据前进行配置,以添加一些不需用户编辑的信息。
用FormData对象发送文件
你也可以用FormData对象发送文件,只需在你的<form>标签间包含一个file类型的<input>元素:
<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 />
<input type="submit" value="Stash the file!" />
</form>
<div></div>
然后你就能用如下代码发送文件了:
var form = document.forms.namedItem("fileinfo");
form.addEventListener('submit', function(ev) {
var oOutput = document.querySelector("div"),
oData = new FormData(form);
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 when trying to upload your file.<br \/>";
}
};
oReq.send(oData);
ev.preventDefault();
}, false);
注意:若你传入了一个表单的引用,那么表单指定的方法(译注:应指Post、Get)会覆盖open()方法调用时指定的。
你也可以直接添加File或Blob到FormData对象,如下:
data.append("myfile", myBlob, "filename.txt");
使用append()方法时,使用第三个可选的参数会指定一个文件名,用于请求头的Content-Disposition字段。若没有指定文件名(或者该参数不被支持),那就默认使用“blob”这个名字。
通过AJAX提交表单和发送文件而不使用FormData对象
若你想了解如何基于AJAX进行序列化和发送表单操作,而不使用FormData对象,可阅读此文。
参见
【译】使用FormData对象的更多相关文章
- 通过Ajax使用FormData对象无刷新上传文件
写在前面:本文说的这个方案有浏览器兼容性问题:所有主流浏览器的较新版本已经支持这个对象了,比如Chrome 7+.Firefox 4+.IE 10+.Opera 12+.Safari 5+,对兼容性比 ...
- H5 FormData对象的使用
XMLHttpRequest Level2 添加了一个新的接口--FormData .[ 主要用于发送表单数据,但也可以独立使用于传输键控数据.与普通的Ajax相比,它能异步上传二进制文件 ] 利用F ...
- html5的FormData对象和input的file属性以及window.URL.createObjectURL( ) 方法(转载)
/** FormData ==>表单数据 能自动把表单数据拼接打包 当ajax发送数据时,发送打包的数据; 还可以使用FormData对象的append(key,value)添加数据 FormD ...
- HTML的FormData对象
FormData是HTML5标准制定的一个新的封装对象,有了FormData对象,可以方便地通过javascript创建表单数据,直接以ajax发送到服务器中. 目前浏览器的支持情况为: 详细的介绍与 ...
- 通过jQuery Ajax使用FormData对象上传文件
FormData对象,是可以使用一系列的键值对来模拟一个完整的表单,然后使用XMLHttpRequest发送这个"表单". 在 Mozilla Developer 网站 使用For ...
- FormData对象
FF4中增加了一个很有意思的对象,FormData.通常我们提交(使用submit button)时,会把form中的所有表格元素的name与value组成一个queryString,提交到后台.这用 ...
- Ajax发送FormData对象封装的表单数据
前端页面: <!doctype html> <html lang="en"> <head> <meta charset="UTF ...
- 使用JS的FormData对象
利用FormData对象,你可以使用一系列的键值对来模拟一个完整的表单,然后使用XMLHttpRequest发送这个"表单". 创建一个FormData对象 你可以先创建一个空的F ...
- FormData+Ajax 实现多文件上传 学习使用FormData对象
FormData对象是为序列化表以及创建与表单格式相同的数据(当然是用于XHR传输)提供便利. 今天我们使用dropzone和FormData实现多文件上传功能. var SAMP = null; / ...
随机推荐
- 二十一、NFS服务
文件系统是基于存储设备的,比如硬盘,并且包含文件物理位置的维护.文件系统也可以说是虚拟数据或网络数据存储的方法,比如NFS.我是这样理解的:首先,什么是文件系统,这里我们已经明确了,就是组织的一种形式 ...
- VMware安装 RHEL安装完后,选择桥接模式如何与主机网络连通
.查看主机的ip与网关,dns配置,如图 2.在linux系统中打开cd /etc/sysconfig/network-scripts/ #进入网络配置文件目录 vi ifcfg-eno1677 ...
- 如何将EXCEL两列比较后不重复的数据复制到另一列上
Q1:我有两列数据,需要做重复性比较,比较完后需要将不重复的数据提取出来自成一列,请问该如何操作? 假如你要比较A列与B列数据是否重复,应该有三种结果(即AB皆有,A有B无,B有A无),可在C列存放A ...
- Lua-文件操作
简单模式和完全模式 简单模式(simple model)拥有一个当前输入文件和一个当前输出文件,并且提供针对这些文件相关的操作. 完全模式(complete model) 使用外部的文件句柄来实现.它 ...
- [LC] 110. Balanced Binary Tree
Given a binary tree, determine if it is height-balanced. For this problem, a height-balanced binary ...
- xpath-helper使用
xpath-helper提取不到frame元素时: https://blog.csdn.net/skywinne/article/details/83832126
- 吴裕雄--天生自然python学习笔记:python文档操作批量替换 Word 文件中的文字
我们经常会遇到在不同的 Word 文件中的需要做相同的文字替换,若是一个一个 文件操作,会花费大量时间 . 本节案例可以找出指定目录中的所有 Word 文件(包含 子目录),并对每一个文件进行指定的文 ...
- cs231n spring 2017 lecture2 Image Classification
1. 相比于传统的人工提取特征(边.角等),深度学习是一种Data-Driven Approach.深度学习有统一的框架,喂不同的数据集,可以训练识别不同的物体.而人工提取特征的方式很脆弱,换一个物体 ...
- 企业框架-Spring
1.什么是Spring Spring是最受欢迎的企业级Java应用程序开发框架,数以百万的来自世界各地的开发人员使用Spring框架来创建性能好.易于测试.可重用的代码. Spring框架是一个开源的 ...
- G1最佳实践
示例 -Xms1550m -Xmx1550m -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -verbosegc -XX:+PrintGCDateStamps -Xlog ...