利用 FormData 对象发送 Key/Value 对的异步请求
- 使用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 对的异步请求的更多相关文章
- 利用 FormData 对象和 Spring MVC 配合可以实现Ajax文件上载功能
Ajax文件上载 利用 FormData 对象和 Spring MVC 配合可以实现Ajax文件上载功能: 步骤 导入组件并准备静态脚本 <dependency> <groupId& ...
- HTML5利用FormData对象实现显示进度条的文件上传
摘自:https://blog.csdn.net/q1056843325/article/details/53759963 自己做是按这个实现的,兼容性还不错 完整简约的解决方案 下面的代码清单是包括 ...
- 利用formdata对象上传文件时,需要添加的参数
function doUpload() { var formData = new FormData($( "#uploadForm" )[0]); $.ajax({ url: 'h ...
- H5 FormData对象的使用
XMLHttpRequest Level2 添加了一个新的接口--FormData .[ 主要用于发送表单数据,但也可以独立使用于传输键控数据.与普通的Ajax相比,它能异步上传二进制文件 ] 利用F ...
- 使用JS的FormData对象
利用FormData对象,你可以使用一系列的键值对来模拟一个完整的表单,然后使用XMLHttpRequest发送这个"表单". 创建一个FormData对象 你可以先创建一个空的F ...
- HTML5 FormData对象
利用FormData对象,你可以使用一系列的键值对来模拟一个完整的表单,然后使用XMLHttpRequest发送这个"表单". 创建一个FormData对象 你可以先创建一个空的F ...
- H5 FormData对象的使用——进行Ajax请求并上传文件
XMLHttpRequest Level2 添加了一个新的接口——FormData .[ 主要用于发送表单数据,但也可以独立使用于传输键控数据.与普通的Ajax相比,它能异步上传二进制文件 ] 利用F ...
- new FormData() - FormData对象的作用及用法
一.概述 FormData 对象的使用: 1.用一些键值对来模拟一系列表单控件:即把form中所有表单元素的name与value组装成 一个queryString 2. 异步上传二进制文件. 二.使用 ...
- 【译】使用FormData对象
系列文章说明 原文 FormData对象能让你生成一系列用于XMLHttpRequest发送的键值对.它主要的目的在于发送表单数据,但也能独立用于传输有键形式的数据.其传输的数据格式和表单使用subm ...
随机推荐
- 解决Unable to load component class org.sonar.scanner.report.ActiveRulesPublisher/Unable to load component interface org.sonar.api.batch.rule.ActiveRules: NullPointerException
解决办法 Delete the directory data/es in your SonarQube installation. Restart SonarQube.
- oracle 建表时显示ORA-00904无效的标识符
oracle 建表时显示ORA-00904无效的标识符 CreationTime--2018年7月19日16点03分 Author:Marydon 1.情景展示 使用plsql建表时,报错 字段展 ...
- HDU 3316 My Brute(二维费用流)经典
My Brute Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...
- PLY格式介绍
PLY是一种电脑档案格式,全名为多边形档案(Polygon File Format)或 斯坦福三角形档案(Stanford Triangle Format). 史丹佛大学的 The Digital ...
- 揭开JDBC的神秘面纱,让JDBC数据库的连接参数不再神秘
1.JDBC是什么? JDBC(Java DataBase Connectivity)java数据库连接 2.JDBC可以做什么? 简单地说,JDBC 可做三件事:与数据库建立连接.发送 ...
- 迅雷极速版|xunlei下载
迅雷很不错的下载软件,曾经出现了,迷你版.极速版... 迅雷极速版 迅雷精简版 迅雷极速版-下载: http://pan.baidu.com/s/1dF3XYTj 密码: 5tj3 迅雷精简版-下载: ...
- vs2017预览版下载
vs2017预览版,没有限制的不过不能生成生产版本,集成最新的功能! 下载地址: https://www.visualstudio.com/zh-hans/vs/preview/
- JSON 接口如何实现 RSA 非对称加密与签名
代码地址如下:http://www.demodashi.com/demo/14000.html 一.概述 1. 数字签名的作用:保证数据完整性,机密性和发送方角色的不可抵赖性,加密与签字结合时,两套公 ...
- lua入门之二:c/c++ 调用lua及多个函数返回值的获取
当 Lua 调用 C 函数的时候,使用和 C 调用 Lua 同样类型的栈来交互. C 函数从栈中获取她的參数.调用结束后将返回结果放到栈中.为了区分返回结果和栈中的其它的值,每一个 C 函数还会返回结 ...
- mysql sleep连接太多怎么办
摘要:interactive_timeout和wait_timeout参数对sleep连接的影响 interactive_timeout 参数含义:服务器关闭交互式连接前等待活动的秒数.交互式客户端定 ...