1. 使用Key/Value对和FormData能够轻易地通过XMLHttpRequest指定要传递什么数据,它是一个非常强大的发送数据到服务器的方法。
  2.  
  3. 基础
  4.  
  5. 通常的方法是你创建一个 FormData 对象。然后你使用append方法来加入任何额外的key和他们的值。就像这样:
  6.  
  7. view source
  8. print?
  9.  
  10. var form = new FormData();
  11. form.append("myName", "Robert");
  12.  
  13. 然后你只需使用XMLHttpRequestXHR)的send方法来发送:
  14.  
  15. var xhrForm = new XMLHttpRequest();
  16.  
  17. xhrForm.open("POST", "getfile.php");
  18.  
  19. xhrForm.send(form);
  20.  
  21. 对于FormData,有趣的是不限制你加入字符串,但是实际上还有许多不同的类型
  22. 字符串
  23. 数字(发送的时候会转换为字符串)
  24. 文件
  25. 二进制对象(BLOB
  26.  
  27. 要想能够在服务器端处理一个FormData的表单,要知道的重点是和一个multipart/form-data编码的常规表单一样发送。
  1. 加入文件和二进制对象(blob)
  2.  
  3. 如果你想加入一个文件,最简单的方法是访问通过一个type="file"的输入元素选择的文件:
  4.  
  5. form.append("theFile", fileInput.files[]);
  6.  
  7. 加入一个二进制对象(blob)
  8.  
  9. 在发送和接收值方面,使用二进制对象(blob)是十分强大的。一个二进制对象(blob)可以手动通过它的内容或者类型的引用去创建:
  10.  
  11. form.append("blobbie", new Blob([imgAsBlobRef], {"type": "image/png"}));
  12.  
  13. 创建你的二进制对象(blob)的内容:
  14.  
  15. 你也可以自己穿件一个二进制对象(blob)的内容:
  16.  
  17. var xmlForBlob = ["Robert"],
  18. xmlBlob = new Blob(xmlForBlob, {"type" : "text/xml"});
  19.  
  20. form.append("xmlParts", xmlBlob);
  21.  
  22. 在页面上获取图像和创建二进制对象(blob
  23.  
  24. 另外,你也可以在页面上通过XHR来获取一个图像然后通过FormData来发送:
  25.  
  26. // Getting a file through XMLHttpRequest as an arraybuffer and creating a Blob
  27. var rhino = document.querySelector("#rhino");
  28. if (rhino) {
  29. var xhr = new XMLHttpRequest(),
  30. blob;
  31.  
  32. xhr.open("GET", "rhino.png", true);
  33. xhr.responseType = "blob";
  34.  
  35. xhr.onreadystatechange = function () {
  36. if (xhr.readyState === && xhr.status === ) {
  37. blob = xhr.response;
  38. var form = new FormData();
  39. form.append("blobbie", blob);
  40.  
  41. var xhrForm = new XMLHttpRequest();
  42. xhrForm.open("POST", "getfile.php");
  43. xhrForm.send(form);
  44. }
  45. };
  46. // Send XHR
  47. xhr.send();
  48. }
  1. 使用Web Activity
  2. 我以前在Mozilla Hacks博客上写过一篇关于Web Activities的文章, 使用里面的方法,你可以访问设备的相机,拍照,然后得到一个二进制对象(blob)的返回结果。
  3. 一旦你获取到它(blob),你就可以把它发送到服务器。在这种情况下,我们会通关过Web Activity拍照,通过FormData发送二进制对象到服务器,然后从服务器获得返回的图像,截止在当前页面中呈现图片:
  4.  
  5. var pick = new MozActivity({
  6. name: "pick",
  7. data: {
  8. type: ["image/png", "image/jpg", "image/jpeg"]
  9. }
  10. });
  11.  
  12. pick.onsuccess = function () {? var form = new FormData();
  13. form.append("blobbie", this.result.blob);
  14.  
  15. var xhrForm = new XMLHttpRequest();
  16. xhrForm.open("POST", "getfile.php");
  17. xhrForm.send(form);
  18.  
  19. xhrForm.onreadystatechange = function () {
  20. if (xhrForm.readyState === ) {
  21. var img = document.createElement("img");
  22. img.src = xhrForm.response;
  23.  
  24. var imagePresenter = document.querySelector("#image-presenter");
  25. imagePresenter.appendChild(img);
  26. imagePresenter.style.display = "block";
  27. }
  28. };
  29. };<span><span style="line-height: 19px;"> </span></span>
  1. 记得文章开头的地方我提到过的表单是在multipart/form-data的编码下发送。这里就是你怎样去读取通过FormData传送的名称、值和二进制对象的内容的方法:
  2. <?php
  3. $fileName = $_FILES['blobbie']['name'];
  4. $fileType = $_FILES['blobbie']['type'];
  5. $fileContent = file_get_contents($_FILES['blobbie']['tmp_name']);
  6. $dataURL = 'data:' . $fileType . ';base64,' . base64_encode($fileContent);
  7. echo $dataURL;
  8. ?>
  9.  
  10. 上面的代码是我在Eric Bidelman的一个gist里的发现的 通常,你应该能用任何的服务器端语言来做到这点。这里选择PHP,只是因为它已经在大多数服务器上运行了。
  1. 一个完整的demo
  2.  
  3. 我把通过XHR获取一个在页面上的图像、通过FormData来传送它、读取内容以及返回一个图像能够再次显示在页面的URL放在了一个完整的例子中。
  4.  
  5. 一般来说,这是一个展示怎样来回发送消失的实践。
  6.  
  7. 可以在以下的URL中获取例子 https://github.com/robnyman/robnyman.github.com/tree/master/html5demos/formdata
  8.  
  9. (大概由于一些原因,GitHub页面不能让你运行PHP代码来读取文件内容,但是在FormData GitHub page 里可以看到带有一个不完整图像的页面/布局)。
  1. JavaScript 代码
  2.  
  3. (function () {
  4. // Getting a file through XMLHttpRequest as an arraybuffer and creating a Blob
  5. var rhino = document.querySelector("#rhino");
  6. if (rhino) {
  7. var xhr = new XMLHttpRequest(),
  8. blob;
  9.  
  10. xhr.open("GET", "rhino.png", true);
  11. /*
  12. 10 Set the responseType to "blob".
  13. 11 If it isn't supported in the targeted web browser,
  14. 12 use "arraybuffer" instead and wrap the response
  15. 13 with new Uint8Array() below
  16. 14 */
  17. xhr.responseType = "blob";
  18.  
  19. xhr.onreadystatechange = function () {
  20. if (xhr.readyState === && xhr.status === ) {
  21. /*
  22. 20 Create a blob from the response
  23. 21 Only needed if the responseType isn't already blob
  24. 22 If it's "arraybuffer", do this:
  25. 23
  26. 24 blob = new Blob([new Uint8Array(xhr.response)], {type: "image/png"});
  27. 25 */
  28. blob = xhr.response;
  29. var form = new FormData();
  30. form.append("blobbie", blob);
  31.  
  32. var xhrForm = new XMLHttpRequest();
  33. xhrForm.open("POST", "getfile.php");
  34. xhrForm.send(form);
  35.  
  36. xhrForm.onreadystatechange = function () {
  37. if (xhrForm.readyState === ) {
  38. console.log(xhrForm.response);
  39. rhino.src = xhrForm.response;
  40. }
  41. };
  42. }
  43. };
  44. // Send XHR
  45. xhr.send();
  46. }
  47. })();
  48.  
  49. PHP 代码
  50.  
  51. <?php
  52. $fileName = $_FILES['blobbie']['name'];
  53. $fileType = $_FILES['blobbie']['type'];
  54. $fileContent = file_get_contents($_FILES['blobbie']['tmp_name']);
  55. $dataURL = 'data:' . $fileType . ';base64,' . base64_encode($fileContent);
  56. echo $dataURL;
  57. ?>
  58.  
  59. 浏览器支持
  60.  
  61. 实际上真的好棒!支持FormData的浏览器有:
  62. Firefox +
  63. Google Chrome +
  64. Safari +
  65. Opera +
  66. Internet Explorer + (计划支持)
  67.  
  68. 支持二进制对象的浏览器有:
  69. Firefox +
  70. Google Chrome +
  71. Safari 5.1+
  72. Opera 12.1+
  73. 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. 解决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.

  2. oracle 建表时显示ORA-00904无效的标识符

      oracle 建表时显示ORA-00904无效的标识符 CreationTime--2018年7月19日16点03分 Author:Marydon 1.情景展示 使用plsql建表时,报错 字段展 ...

  3. HDU 3316 My Brute(二维费用流)经典

    My Brute Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total S ...

  4. PLY格式介绍

    PLY是一种电脑档案格式,全名为多边形档案(Polygon File Format)或 斯坦福三角形档案(Stanford Triangle Format).  史丹佛大学的 The Digital ...

  5. 揭开JDBC的神秘面纱,让JDBC数据库的连接参数不再神秘

    1.JDBC是什么? JDBC(Java DataBase Connectivity)java数据库连接 2.JDBC可以做什么?        简单地说,JDBC 可做三件事:与数据库建立连接.发送 ...

  6. 迅雷极速版|xunlei下载

    迅雷很不错的下载软件,曾经出现了,迷你版.极速版... 迅雷极速版 迅雷精简版 迅雷极速版-下载: http://pan.baidu.com/s/1dF3XYTj 密码: 5tj3 迅雷精简版-下载: ...

  7. vs2017预览版下载

    vs2017预览版,没有限制的不过不能生成生产版本,集成最新的功能! 下载地址: https://www.visualstudio.com/zh-hans/vs/preview/

  8. JSON 接口如何实现 RSA 非对称加密与签名

    代码地址如下:http://www.demodashi.com/demo/14000.html 一.概述 1. 数字签名的作用:保证数据完整性,机密性和发送方角色的不可抵赖性,加密与签字结合时,两套公 ...

  9. lua入门之二:c/c++ 调用lua及多个函数返回值的获取

    当 Lua 调用 C 函数的时候,使用和 C 调用 Lua 同样类型的栈来交互. C 函数从栈中获取她的參数.调用结束后将返回结果放到栈中.为了区分返回结果和栈中的其它的值,每一个 C 函数还会返回结 ...

  10. mysql sleep连接太多怎么办

    摘要:interactive_timeout和wait_timeout参数对sleep连接的影响 interactive_timeout 参数含义:服务器关闭交互式连接前等待活动的秒数.交互式客户端定 ...