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

摘要:
因此,使用FormData,您可以轻松地使用ajax上传文件。方法3:使用表单对象的getFormData方法生成varformobj=document。按Id获取元素;varformdata=表单对象。获取表单数据();使用FormData对象,结合原生js,通过ajax异步上传图片。

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

利用FormData对象,可通过js用一些键值对来模拟一系列表单控件,还可以使用XMLHttpRequest的send()方法异步提交表单。

首先,在之前的“前后台交互之传参方式”中讲了传统的form表单提交的方式(表单序列化),它只适用于传递一般参数,上传文件的文件流是无法被序列化并传递的。所以,使用FormData,可以轻松的和ajax结合进行文件上传。

一、在介绍使用FormData进行Ajax请求并上传文件之前,先来认识一下FormData以及它的使用:::::

W3C 草案提供了三种方案来获取或修改 Form Data :::

WAY1:创建一个空的 Form Data 对象,再用 append() 逐个添加键值对

var oMyForm = new FormData();    //创建一个空的FormData对象
oMyForm.append("userName","Coco");       //append()方法添加字段
oMyForm.append("accountNum",123456);   //数字123456立即被转换成字符串“123456”
oMyForm.append("userFile",fileInputElement.files[0]);
var oFileBody = "<a id="a"><b id="b">hey!</b></a>";
var oBlob = new Blob([oFileBody],{type:"text/html"});  //Blob对象包含的文件内容是oFileBody
oMyForm.append("webmasterfile",oBlob);
var oReq = newXMLHttpRequest();
oReq.open("POST","   .php");
oPeq.send(oMyForm);   //使用XMLHttpRequest的send()把数据发送出去

上面的"userFile"和"webmasterfile"的值都包含了一个文件;

字段的值可以是一个Blob对象,File对象或者字符串,别的类型都会被自动转换成字符串——例如上面的"accountNum" 。

WAY2:取form元素对象作为参数传入FormData对象中

—— 伪代码 ——

var new_FormData = new FormData( someFormElement );           

例:

var FormElement = document.getElementById("myFormElement");
var oReq = newXMLHttpRequest();
oReq.open("POST","     .php");
oReq.send(new FormData(FormData));

也可以在已有表单基础上继续添加新的键值对:

var FormElement = document.getElementById("myFormElement");
var formData = newFormData(FormElement);
formData.append("serialnumber",serialNumber++);
var oReq = newXMLHttpRequest();
oReq.send(formData);

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

WAY3:利用form对象的getFormData方法生成

var formobj = document.getElementById("myFormElement");
var formdata = formobj.getFormData();

利用 FormData 对象,结合原生的 js,通过 ajax 实现异步上传图片。当然,现在已有的 jquery 批量上传的插件,原理就是利用 FormData。

二、使用 FormData对象发送二进制文件::::::

way1:通过 form 表单来初始化 FormData

1、在 html 中有一个包含文件输入框的 form 元素

<form enctype="multipare/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>

2、异步上传用户所选的文件

functionsendForm(){
      var oOutput = document.getElementById("Output");
      var oData = new FormData(document.forms.nameItem("fileInfo"));
      oData.append("customField","This is some extra data");
      var oReq = newXMLHttpRequest();
      oReq.open("POST","     .php",true);
      oReq.onload = function(oEvent){
            if(oReq.status == 200){
                   oOutput.innerHTML = "Uploaded!";
            }else{
                   oOutput.innerHTML = "Error" + oReq.status + "occurred uploading your file!"
            }
      };
      oReq.send(oData);
}

WAY2:不借助 form 表单,直接向 FormData 对象中添加一个 File 对象或者一个 Blob 对象

var data = newFormData();
var oFileBody = "<a id="a"><b id="b">hey!</b></a>";
var oBlob = new Blob([oFileBody],{type:"text/html"});
data.append("myfile",oBlob);

如果 FormData 对象中某个字段值是一个 Blob 对象,在发送 HTTP 请求时,代表该 Blob 对象所包含文件的文件名的 “content-Disposition” 请求的值在不同浏览器中不同:

Firefox 使用固定的字符串 "blob",而 chrome使用一个随机字符串。

WAY3:使用 Jquery 发送 FormData(要正确设置相关项)

var fd =new FormData(document.getElementById("fileinfo"));
fd.append("customField","This is some extra data");
$.ajax({
     url:"    .php",
     type:"POST",
     data:fd,
     processData:false,   //告诉jquery不要处理发送的数据
     contentType:false    //告诉jquery不要设置content-Type请求头
});
三、例子

1、使用 FromData 进行 Ajax 请求,并上传文件

<form id="uploadForm">
      指定文件名:<input type="text"name="filename"value="">
      上传文件:<input type="file"name="file">
       <input type="button"value="上传"onclick="doUpload()">
</form>
functiondoUpload(){
    var formData = new FormData($("#uploadForm")[0]);
    $.ajax({
          url:"   .php",
          type:"POST",
          data:formData,
          async:false,
          cache:false,
          contentType:false,
          processData:false,
          success:function(returndata){
                 alert(returndata);
          },
          error:function(returndata){
                 alert("error:"+returndata);
          }
    });
}

2、使用 FormData 提交表单及上传图片

<form name="form"id="formData">
       name:<input type="text"name="name">
       gender:<input type="radio"name="gender"value="1"> male
              <input type="radio"name="gender"value="2"> female
       photo:<input type="file"name="photo"id="photo">
       <input type="button"name="btn"value="submit"onclick="submit();">       
</form>
<div id="result"></div>
functionsubmit(){
       var data = new FormData($("#formData")[0]);
       $.ajax({
              url:"    .php",
              type:"POST",
              data:data,
              dataType:"JSON",
              cache:false,
              processData:false,
              contentType:false
        }).done(function(ret){
                  if(ret["isSuccess"]){
                      var result = "";
                      result +="name=" + ret["name"] + "<br>";
                      result += "gender=" + ret["gender"] + "<br>";
                      result += "<img src='https://tool.4xseo.com/article/143833.html"+ret['photo']+"'width='100'>";
                      $("#result").html(result);         //提交成功后将表单数据显示在id="result"的div里面     
                  }else{
                         alert("提交失败");
                   }
         });
       return false;
}
四、浏览器兼容性
ChromeFirefox(Gecko)IEOperaSafari
7+4.0(2.0)+10+12+5+

免责声明:文章转载自《H5 FormData对象的使用——进行Ajax请求并上传文件》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇调用NMAP批量扫描IP端口腾讯蓝鲸 cmdb 源码编译下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

JAVA框架-前后端分离(Json和ajax)

为什么要前后端分离? 在以前的学习代码中,可以看出来我们在jsp页面页面上也通过EL表达式和jstl写了很多的java程序,这实际上在前端的页面中混入了很多后端的逻辑,这就是传统的web开发。在传统的web开发中,页面展示的内容以及页面之间的跳转逻辑,全都由后台来控制,这导致了前后端耦合度非常高,耦合度高则意味着,扩展性差,维护性差,等等问题 传统开发的问...

jquery参考手册

jQuery 选择器 选择器 实例 选取 * $("*") 所有元素 #id $("#lastname") 的元素 .class $(".intro") 的所有元素 .class,.class $(".intro,.demo") class 为 "intro" 或 "demo" 的所有元素 element $("p")...

vue filter 去掉HTML标签

Vue.filter('removeHtml', input => { return input && input.replace(/<(?:.| )*?>/gm, '') .replace(/(&rdquo;)/g, '"') .replace(/&ldquo;/g, '"')...

json数据映射填充到html元素显示

映射算法做了改进,支持name重复映射 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>javascript test</title> <script type="text/javas...

ubuntu添加中文输入法

11.04以前到版本: 1、System->Administration->Language Support-> Install Languages.  chose  Chinese(simplified), 现在就等待吧。 2、System->Preferences->IBus Prefernces.在Input metho...

如何触发react input change事件

页面用react来进行开发的,想触发react组件里面input的change事件,用Jquery的trigger来触发没有效果,必须使用原生的事件来进行触发。var event = new Event('input', { bubbles: true });element.dispatchEvent(event);...