使用Key/Value对和FormData能够轻易地通过XMLHttpRequest指定要传递什么数据,它是一个非常强大的发送数据到服务器的方法。

基础 

通常的方法是你创建一个 FormData 对象。然后你使用append方法来加入任何额外的key和他们的值。就像这样: 

view source
print? var form = new FormData();
form.append("myName", "Robert"); 然后你只需使用XMLHttpRequest(XHR)的send方法来发送: var xhrForm = new XMLHttpRequest(); xhrForm.open("POST", "getfile.php"); xhrForm.send(form); 对于FormData,有趣的是不限制你加入字符串,但是实际上还有许多不同的类型
• 字符串
• 数字(发送的时候会转换为字符串)
• 文件
• 二进制对象(BLOB) 要想能够在服务器端处理一个FormData的表单,要知道的重点是和一个multipart/form-data编码的常规表单一样发送。
加入文件和二进制对象(blob) 

如果你想加入一个文件,最简单的方法是访问通过一个type="file"的输入元素选择的文件: 

 form.append("theFile", fileInput.files[]); 

加入一个二进制对象(blob) 

在发送和接收值方面,使用二进制对象(blob)是十分强大的。一个二进制对象(blob)可以手动通过它的内容或者类型的引用去创建: 

 form.append("blobbie", new Blob([imgAsBlobRef], {"type": "image/png"})); 

创建你的二进制对象(blob)的内容: 

你也可以自己穿件一个二进制对象(blob)的内容: 

 var xmlForBlob = ["Robert"],
xmlBlob = new Blob(xmlForBlob, {"type" : "text/xml"}); form.append("xmlParts", xmlBlob); 在页面上获取图像和创建二进制对象(blob) 另外,你也可以在页面上通过XHR来获取一个图像然后通过FormData来发送: // Getting a file through XMLHttpRequest as an arraybuffer and creating a Blob
var rhino = document.querySelector("#rhino");
if (rhino) {
var xhr = new XMLHttpRequest(),
blob; xhr.open("GET", "rhino.png", true);
xhr.responseType = "blob"; xhr.onreadystatechange = function () {
if (xhr.readyState === && xhr.status === ) {
blob = xhr.response;
var form = new FormData();
form.append("blobbie", blob); var xhrForm = new XMLHttpRequest();
xhrForm.open("POST", "getfile.php");
xhrForm.send(form);
}
};
// Send XHR
xhr.send();
}
使用Web Activity
我以前在Mozilla Hacks博客上写过一篇关于Web Activities的文章, 使用里面的方法,你可以访问设备的相机,拍照,然后得到一个二进制对象(blob)的返回结果。
一旦你获取到它(blob),你就可以把它发送到服务器。在这种情况下,我们会通关过Web Activity拍照,通过FormData发送二进制对象到服务器,然后从服务器获得返回的图像,截止在当前页面中呈现图片: var pick = new MozActivity({
name: "pick",
data: {
type: ["image/png", "image/jpg", "image/jpeg"]
}
}); pick.onsuccess = function () {? var form = new FormData();
form.append("blobbie", this.result.blob); var xhrForm = new XMLHttpRequest();
xhrForm.open("POST", "getfile.php");
xhrForm.send(form); xhrForm.onreadystatechange = function () {
if (xhrForm.readyState === ) {
var img = document.createElement("img");
img.src = xhrForm.response; var imagePresenter = document.querySelector("#image-presenter");
imagePresenter.appendChild(img);
imagePresenter.style.display = "block";
}
};
};<span><span style="line-height: 19px;"> </span></span>
记得文章开头的地方我提到过的表单是在multipart/form-data的编码下发送。这里就是你怎样去读取通过FormData传送的名称、值和二进制对象的内容的方法:
<?php
$fileName = $_FILES['blobbie']['name'];
$fileType = $_FILES['blobbie']['type'];
$fileContent = file_get_contents($_FILES['blobbie']['tmp_name']);
$dataURL = 'data:' . $fileType . ';base64,' . base64_encode($fileContent);
echo $dataURL;
?> 上面的代码是我在Eric Bidelman的一个gist里的发现的 。 通常,你应该能用任何的服务器端语言来做到这点。这里选择PHP,只是因为它已经在大多数服务器上运行了。
一个完整的demo 

我把通过XHR获取一个在页面上的图像、通过FormData来传送它、读取内容以及返回一个图像能够再次显示在页面的URL放在了一个完整的例子中。 

一般来说,这是一个展示怎样来回发送消失的实践。 

可以在以下的URL中获取例子 https://github.com/robnyman/robnyman.github.com/tree/master/html5demos/formdata 

(大概由于一些原因,GitHub页面不能让你运行PHP代码来读取文件内容,但是在FormData GitHub page 里可以看到带有一个不完整图像的页面/布局)。 
JavaScript 代码 

 (function () {
// Getting a file through XMLHttpRequest as an arraybuffer and creating a Blob
var rhino = document.querySelector("#rhino");
if (rhino) {
var xhr = new XMLHttpRequest(),
blob; xhr.open("GET", "rhino.png", true);
/*
10 Set the responseType to "blob".
11 If it isn't supported in the targeted web browser,
12 use "arraybuffer" instead and wrap the response
13 with new Uint8Array() below
14 */
xhr.responseType = "blob"; xhr.onreadystatechange = function () {
if (xhr.readyState === && xhr.status === ) {
/*
20 Create a blob from the response
21 Only needed if the responseType isn't already blob
22 If it's "arraybuffer", do this:
23
24 blob = new Blob([new Uint8Array(xhr.response)], {type: "image/png"});
25 */
blob = xhr.response;
var form = new FormData();
form.append("blobbie", blob); var xhrForm = new XMLHttpRequest();
xhrForm.open("POST", "getfile.php");
xhrForm.send(form); xhrForm.onreadystatechange = function () {
if (xhrForm.readyState === ) {
console.log(xhrForm.response);
rhino.src = xhrForm.response;
}
};
}
};
// Send XHR
xhr.send();
}
})(); PHP 代码 <?php
$fileName = $_FILES['blobbie']['name'];
$fileType = $_FILES['blobbie']['type'];
$fileContent = file_get_contents($_FILES['blobbie']['tmp_name']);
$dataURL = 'data:' . $fileType . ';base64,' . base64_encode($fileContent);
echo $dataURL;
?> 浏览器支持 实际上真的好棒!支持FormData的浏览器有:
•Firefox +
• Google Chrome +
• Safari +
• Opera +
• Internet Explorer + (计划支持) 支持二进制对象的浏览器有:
•Firefox +
• Google Chrome +
• Safari 5.1+
• Opera 12.1+
• Internet Explorer + (计划支持)

利用 FormData 对象发送 Key/Value 对的异步请求的更多相关文章

  1. 利用 FormData 对象和 Spring MVC 配合可以实现Ajax文件上载功能

    Ajax文件上载 利用 FormData 对象和 Spring MVC 配合可以实现Ajax文件上载功能: 步骤 导入组件并准备静态脚本 <dependency> <groupId& ...

  2. HTML5利用FormData对象实现显示进度条的文件上传

    摘自:https://blog.csdn.net/q1056843325/article/details/53759963 自己做是按这个实现的,兼容性还不错 完整简约的解决方案 下面的代码清单是包括 ...

  3. 利用formdata对象上传文件时,需要添加的参数

    function doUpload() { var formData = new FormData($( "#uploadForm" )[0]); $.ajax({ url: 'h ...

  4. H5 FormData对象的使用

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

  5. 使用JS的FormData对象

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

  6. HTML5 FormData对象

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

  7. H5 FormData对象的使用——进行Ajax请求并上传文件

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

  8. new FormData() - FormData对象的作用及用法

    一.概述 FormData 对象的使用: 1.用一些键值对来模拟一系列表单控件:即把form中所有表单元素的name与value组装成 一个queryString 2. 异步上传二进制文件. 二.使用 ...

  9. 【译】使用FormData对象

    系列文章说明 原文 FormData对象能让你生成一系列用于XMLHttpRequest发送的键值对.它主要的目的在于发送表单数据,但也能独立用于传输有键形式的数据.其传输的数据格式和表单使用subm ...

随机推荐

  1. iOS判断日期A是否在日期B到日期C之间

    方法一: 可以用nsdate 的 timeIntervalSince1970 方法把时间转换成时间戳进行比较,这里timeIntervalSince1970返回的是NSTimeInterval(dou ...

  2. Linux软件安装方法

    常用的两种软件安装方法: 1.RPM软件安装 rpm -qi 软件名 查询 rpm -ivh *.rpm 安装 rpm -e 软件名 卸载 系统自带的一些rpm包在系统镜像的Server文件夹里,需要 ...

  3. IDEA开发web程序配置Tomcat

    1.下载zip版的Tomcat 7,并解压2.在IDEA中配置Tomcat 7 在idea中的Settings(Ctrl+Alt+s)(或者点击图标 ) 弹出窗口左上过滤栏中输入“Applicatio ...

  4. 【CMS】DedeCMS Error: (PHP 5.3 and above) Please set 'request_order' ini value to include C,G and P (recommended: 'CGP') in php.ini

    DedeCMS Error: (PHP 5.3 and above) Please set 'request_order' ini value to include C,G and P (recomm ...

  5. Java 基础【13】 I/O流概念分析整理

    转载地址:http://blog.csdn.net/yuebinghaoyuan/article/details/7388059 java.io 中的流,可以从不同的角度进行分类. 按照数据流的方向不 ...

  6. Maven的settings.xml文件结构之mirrors

    Maven的远程库提供大量构件,供Maven项目直接下载使用.对于一个Maven项目,如果没有特别声明,默认使用Maven的central库,url如下: http://repo.maven.apac ...

  7. 〖Linux〗联想K860/i Android 4.2及以上的Bootimg解压与打包工具

    因为自己有需要,所以花了一点时间来写了一下. 1. 解压工具 #!/bin/bash - #====================================================== ...

  8. Mybatis日期类型的关系判断

    进行时间段的查询时,在mapper文件中直接使用">","<"等关系运算符是无法解析的 <if test="executeStart ...

  9. mysql中char,varchar,text

    1.char char最大长度是255字符,注意是字符数和字符集没关系. 1)可以有默认值, 2)尾部有空格会被截断 3)不管汉字.英文,还是其他编码,都可以存255字符 2.varchar 1)va ...

  10. BasicAuth和OAuth

    参考资料 百度百科BasicAuth 维基百科OAuth BasicAuth基本授权 BasicAuth又叫HttpAuth,它非常简单.例如你访问一个页面时,会弹出用户名密码框 它的优点是:简单,只 ...