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

原文链接:https://blog.csdn.net/AlbenXie/article/details/100103709

建议看原文哦

一、js FormData方法介绍
1. 概述
FormData类型其实是在XMLHttpRequest 2级定义的,它是为序列化表以及创建与表单格式相同的数据(当然是用于XHR传输)提供便利。

2. 构造函数
创建一个formData对象实例有几种方式:

1、创建一个空对象实例

var formData = new FormData();
此时可以调用append()方法来添加数据

2、使用已有的表单来初始化一个对象实例

假如现在页面已经有一个表单

<form id="myForm" action="" method="post">
    <input type="text" name="name">名字
    <input type="password" name="psw">密码
    <input type="submit" value="提交">
</form>
我们可以使用这个表单元素作为初始化参数,来实例化一个formData对象

// 获取页面已有的一个form表单
var form = document.getElementById("myForm");
// 用表单来初始化
var formData = new FormData(form);
// 我们可以根据name来访问表单中的字段
var name = formData.get("name"); // 获取名字
var psw = formData.get("psw"); // 获取密码
// 当然也可以在此基础上,添加其他数据
formData.append("token","kshdfiwi3rh");
3. 操作方法
首先,我们要明确formData里面存储的数据形式,一对key/value组成一条数据,key是唯一的,一个key可能对应多个value。如果是使用表单初始化,每一个表单字段对应一条数据,它们的HTML name属性即为key值,它们value属性对应value值。

3.1 获取值
我们可以通过get(key)/getAll(key)来获取对应的value,

formData.get("name"); // 获取key为name的第一个值
formData.get("name"); // 返回一个数组,获取key为name的所有值
3.2 添加数据
我们可以通过append(key, value)来添加数据,如果指定的key不存在则会新增一条数据,如果key存在,则添加到数据的末尾

formData.append("k1", "v1");
formData.append("k1", "v2");
formData.append("k1", "v1");
 
formData.get("k1"); // "v1"
formData.getAll("k1"); // ["v1","v2","v1"]
3.3 设置修改数据
我们可以通过set(key, value)来设置修改数据,如果指定的key不存在则会新增一条,如果存在,则会修改对应的value值。

formData.append("k1", "v1");
formData.set("k1", "1");
formData.getAll("k1"); // ["1"]
3.4 判断是否该数据
我们可以通过has(key)来判断是否对应的key值

formData.append("k1", "v1");
formData.append("k2",null);
 
formData.has("k1"); // true
formData.has("k2"); // true
formData.has("k3"); // false
3.5 删除数据
通过delete(key),来删除数据

formData.append("k1", "v1");
formData.append("k1", "v2");
formData.append("k1", "v1");
formData.delete("k1");
 
formData.getAll("k1"); // []
3.6 遍历
我们可以通过entries()来获取一个迭代器,然后遍历所有的数据,

formData.append("k1", "v1");
formData.append("k1", "v2");
formData.append("k2", "v1");
 
var i = formData.entries();
 
i.next(); // {done:false, value:["k1", "v1"]}
i.next(); // {done:fase, value:["k1", "v2"]}
i.next(); // {done:fase, value:["k2", "v1"]}
i.next(); // {done:true, value:undefined}
可以看到返回迭代器的规则

每调用一次next()返回一条数据,数据的顺序由添加的顺序决定

返回的是一个对象,当其done属性为true时,说明已经遍历完所有的数据,这个也可以作为判断的依据

返回的对象的value属性以数组形式存储了一对key/value,数组下标0为key,下标1为value,如果一个key值对应多个value,会变成多对key/value返回

我们也可以通过values()方法只获取value值

formData.append("k1", "v1");
formData.append("k1", "v2");
formData.append("k2", "v1");
 
var i = formData.entries();
 
i.next(); // {done:false, value:"v1"}
i.next(); // {done:fase, value:"v2"}
i.next(); // {done:fase, value:"v1"}
i.next(); // {done:true, value:undefined}
4. 发送数据
我们可以通过xhr来发送数据

var xhr = new XMLHttpRequest();
xhr.open("post","login");
xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
xhr.send(formData);
这种方式可以来实现文件的异步上传。

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

2、使用
1.FormData对象的操作方法,全部在原型中,自己本身没任何的属性及方法。

let formData = new FormData()
formData.append('user', 'zhang')
获取 formData.get('user')  //zhang
删除 formData.delete('user')
.....
2.使用FormData对象发送文件

HTML部分
<form action="">
    <label for="">
        姓名: <input type="text" name="name">
    </label>
    <label for="">
        文件:<input id="file" type="file" name="file">
    </label>
    <label for="">
        <input type="button" value="保存">
    </label>
</form>
JS部分
var btn = document.querySelector('[type=button]');
btn.onclick = function () {
    // 文件元素
    var file = document.querySelector('[type=file]');
    // 通过FormData将文件转成二进制数据
    var formData = new FormData();
    // 将文件转二进制
    *****注意2******
    formData.append('upload', file.files[0]);
    *****注意1******
    var xhr = new XMLHttpRequest;
    xhr.open('post', 'file.php');
    // 监听上传进度
    xhr.upload.onprogress = function (ev) {
    // 事件对象
    // console.log(ev);
        var percent = (ev.loaded / ev.total) * 100 + '%';
        console.log(percent);
        progress.style.width = percent;
    }
 
    xhr.send(formData);
    xhr.onreadystatechange = function () {
            if(xhr.readyState == 4 && xhr.status == 200) {
                    //
            }
    }
}
 

注意1:使用jQuery

 $.ajax({
    url: 'file.php',
    type: 'POST',
    data: formdata,                    // 上传formdata封装的数据
    dataType: 'JSON',
    cache: false,                      // 不缓存
    processData: false,                // jQuery不要去处理发送的数据
    contentType: false,                // jQuery不要去设置Content-Type请求头
    success:function (data) {           //成功回调
        console.log(data);
    }
});
 

注意2:参数

new FormData的参数是一个DOM对象,而非jQuery对象

var formData = new FormData($("#file")[0]);
3、jQuery的参数序列化方法serialize()
序列表表格内容为字符串,用于 Ajax 请求。 

$("form").serialize()
三、补充:关于XMLHttpRequest 对象
XMLHttpRequest 对象提供了对 HTTP 协议的完全的访问,包括做出 POST 和 HEAD 请求以及普通的 GET 请求的能力。XMLHttpRequest 可以同步或异步地返回 Web 服务器的响应,并且能够以文本或者一个 DOM 文档的形式返回内容。

尽管名为 XMLHttpRequest,它并不限于和 XML 文档一起使用:它可以接收任何形式的文本文档。

属性
readyState 
HTTP 请求的状态.当一个 XMLHttpRequest 初次创建时,这个属性的值从 0 开始,直到接收到完整的 HTTP 响应,这个值增加到 4。

5 个状态中每一个都有一个相关联的非正式的名称,下表列出了状态、名称和含义:

状态    名称    属性
0    Uninitialized    初始化状态。XMLHttpRequest 对象已创建或已被 abort() 方法重置。
1    Open    open() 方法已调用,但是 send() 方法未调用。请求还没有被发送。
2    Sent    Send() 方法已调用,HTTP 请求已发送到 Web 服务器。未接收到响应。
3    Receiving    所有响应头部都已经接收到。响应体开始接收但未完成。
4    Loaded    HTTP 响应已经完全接收。

readyState 的值不会递减,除非当一个请求在处理过程中的时候调用了 abort() 或 open() 方法。每次这个属性的值增加的时候,都会触发 onreadystatechange 回调函数。

responseText 
目前为止为服务器接收到的响应体(不包括头部),或者如果还没有接收到数据的话,就是空字符串。

如果 readyState 小于 3,这个属性就是一个空字符串。当 readyState 为 3,这个属性返回目前已经接收的响应部分。如果 readyState 为 4,这个属性保存了完整的响应体。

如果响应包含了为响应体指定字符编码的头部,就使用该编码。否则,假定使用 Unicode UTF-8。

responseXML 
对请求的响应,解析为 XML 并作为 Document 对象返回。

status 
由服务器返回的 HTTP 状态代码,如 200 表示成功,而 404 表示 “Not Found” 错误。当 readyState 小于 3 的时候读取这一属性会导致一个异常。

statusText 
这个属性用名称而不是数字指定了请求的 HTTP 的状态代码。也就是说,当状态为 200 的时候它是 “OK”,当状态为 404 的时候它是 “Not Found”。和 status 属性一样,当 readyState 小于 3 的时候读取这一属性会导致一个异常。

timeout 
超时时间,毫秒数。

方法
abort() 
取消当前响应,关闭连接并且结束任何未决的网络活动。

这个方法把 XMLHttpRequest 对象重置为 readyState 为 0 的状态,并且取消所有未决的网络活动。例如,如果请求用了太长时间,而且响应不再必要的时候,可以调用这个方法。

getAllResponseHeaders() 
把 HTTP 响应头部作为未解析的字符串返回。

如果 readyState 小于 3,这个方法返回 null。否则,它返回服务器发送的所有 HTTP 响应的头部。头部作为单个的字符串返回,一行一个头部。每行用换行符 “\r\n” 隔开。

getResponseHeader() 
返回指定的 HTTP 响应头部的值。其参数是要返回的 HTTP 响应头部的名称。可以使用任何大小写来制定这个头部名字,和响应头部的比较是不区分大小写的。

该方法的返回值是指定的 HTTP 响应头部的值,如果没有接收到这个头部或者 readyState 小于 3 则为空字符串。如果接收到多个有指定名称的头部,这个头部的值被连接起来并返回,使用逗号和空格分隔开各个头部的值。

open() 
初始化 HTTP 请求参数,例如 URL 和 HTTP 方法,但是并不发送请求。

send() 
发送 HTTP 请求,使用传递给 open() 方法的参数,以及传递给该方法的可选请求体。

setRequestHeader() 
向一个打开但未发送的请求设置或添加一个 HTTP 请求。

事件监听
4个事件:分别是progress(加载进度),load(请求完成并接受到服务器返回结果),error(请求错误),abort(终止请求)。 
代码:

var oReq = new XMLHttpRequest();
 
oReq.upload.addEventListener("progress", updateProgress);
oReq.upload.addEventListener("load", transferComplete);
oReq.upload.addEventListener("error", transferFailed);
oReq.upload.addEventListener("abort", transferCanceled);
 
oReq.open();
参考文档:

https://www.cnblogs.com/fps2tao/p/9760676.html

https://www.cnblogs.com/gczmn/p/9437935.html

https://blog.csdn.net/wang704987562/article/details/81045818

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: new FormData()是一种JavaScript API,用于创建一个空的FormData对象,可以用来传递表单数据或其他类型的数据,例如文件或Blob对象。可以使用append()方法向FormData对象中添加键值对,然后将其传递给服务器端进行处理。它通常用于通过AJAX发送数据。 ### 回答2: 在前端开发中,我们常常需要向服务器发送数据。而向服务器发送数据的方法有很多种,其中就包括使用formData对象。 在JavaScript中,我们可以使用new FormData()方法来创建一个formData对象。创建好formData对象之后,我们可以使用append()方法将需要发送到服务器的数据添加进去。接下来,我们将这个formData对象作为请求中的body部分,并发送给服务器。 formData对象可以添加不同类型的数据,包括字符串、文件、Blob对象等等。formData对象的一个很大的优点是,它能够轻松地在前端将表单中的数据全部封装起来,并且可以将这些数据作为一整个formData对象发送到后端,非常方便。 在JavaScript中,我们可以这样创建一个formData对象: ``` let formData = new FormData(); ``` 接下来,我们可以使用append()方法往formData对象中添加数据: ``` formData.append('username', 'jerry'); formData.append('password', '123456'); formData.append('file', fileObj); ``` 其中,'username'和'password'是需要发送到后端的普通字符串数据,而'file'是需要发送到后端的文件数据。fileObj则是一个文件对象,可以是通过<input type="file">选择文件后获取的。 最后,在发送请求的时候,我们可以使用fetch()方法来发送请求,代码如下: ``` fetch(url, { method: 'POST', body: formData }).then(response => { // 处理响应数据的逻辑 }); ``` 在上面的代码中,我们将formData对象作为了请求的body部分,并使用POST请求将它发送到了服务器。服务器在接收到请求时,就可以直接从request body中获取到前端所发送的数据了。 总之,formData对象是一种非常方便的前端数据传递方式,它可以将表单中的数据封装为一个对象,并作为整体发送给后端进行处理,减少了多次单独发送请求的麻烦,提高了开发效率。 ### 回答3: FormData是一种将键值对数据结构化的方式,可用于通过XMLHttpRequest发送表单数据。传递对象指的是使用Ajax请求发送一个表单,表单的数据需要通过FormData进行封装,包括文件数据。用法如下: ```javascript const formData = new FormData(); formData.append("username", "test"); formData.append("password", "123456"); formData.append("avatar", file); ``` 上述代码中,我们创建了一个FormData对象,并使用它的append()方法往里面添加了三个属性值对,分别是username和password的字符串数据、以及avatar的二进制数据,这里的file变量需要在HTML中通过input元素的type为file的控件实例化的; 接下来,我们可以使用XMLHttpRequest发送这个FormData,使用方式如下: ```javascript const xhr = new XMLHttpRequest(); xhr.open("POST", "/api/submit"); xhr.send(formData); ``` 以上就是new FormData()传递对象用法。通过FormData,我们可以方便地封装表单数据,同时支持文件类型,来实现表单的异步提交。这种方式在前端开发中非常常见,特别是涉及到上传文件的场景,能够大大地提高开发效率,减少代码量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值