FormData类型其实是在XMLHttpRequest 2级定义的,它是为序列化表以及创建与表单格式相同的数据(当然是用于XHR传输)提供便利。
二、FormData的主要用途 将form表单元素的name与value进行组合,实现表单数据的序列化,从而减少表单元素的拼接,提高工作效率。异步上传文件 三、FormData的使用 1.基本使用创建一个formData对象实例有几种方式
1.创建一个空对象实例
var formData = new FormData();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"); 2. 操作方法首先,我们要明确formData里面存储的数据形式,一对key/value组成一条数据,key是唯一的,一个key可能对应多个value。如果是使用表单初始化,每一个表单字段对应一条数据,它们的HTML name属性即为key值,它们value属性对应value值。
2.1 获取值
我们可以通过get(key)/getAll(key)来获取对应的value,
2.2 添加数据
我们可以通过append(key, value)来添加数据,如果指定的key不存在则会新增一条数据,如果key存在,则添加到数据的末尾
2.3 设置修改数据
我们可以通过set(key, value)来设置修改数据,如果指定的key不存在则会新增一条,如果存在,则会修改对应的value值。
2.4 判断是否该数据
我们可以通过has(key)来判断是否对应的key值
2.5 删除数据
通过delete(key),来删除数据
2.6 遍历
我们可以通过entries()来获取一个迭代器,然后遍历所有的数据,
可以看到返回迭代器的规则
每调用一次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} 3.发送数据我们可以通过xhr来发送数据
var xhr = new XMLHttpRequest();xhr.open("post","login");xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");xhr.send(formData);这种方式可以来实现文件的异步上传。
4.jquery实例 //添加数据方式见上二。//processData: false, contentType: false,多用来处理异步上传二进制文件。 $.ajax({ url: 'xxx', type: 'POST', data: formData, // 上传formdata封装的数据 dataType: 'JSON', cache: false, // 不缓存 processData: false, // jQuery不要去处理发送的数据 contentType: false, // jQuery不要去设置Content-Type请求头 success:function (data) { //成功回调 console.log(data); }}); 5.vue项目中FormData的使用: // 所填所有数据验证没有问题后,执行该回调函数feedback() { feedback({ itemId: this.itemId, goodsId: this.goods.id, childOrderId: this.detail.id, afterSalesType: this.currentTab, reason: this.reason, description: this.description, addressId: this.address.id }).then(res => { let that = this; if (res.data.code == 0) { this.type = res.data.type; this.itemId = res.data.itemId; this.orderId = res.data.orderId; this.belongOrder = res.data.belongOrder; if (this.imgList.length > 0) { this.uploadImage(this.itemId,this.belongOrder,this.type); this.uploadP(); } else { this.$Message.success({ content: res.data.msg, onClose: function() { that.$router.go(-1); } }); } } else { this.$Message.error(res.data.msg); } });},// 上传文本和图片文件uploadImage(id,blondId,type) { // var form = document.forms.namedItem("fileinfo"); var formData = new FormData(); for (var i = 0; i < this.imgList.length; i++) { formData.append("files", this.imgList[i].file); } formData.append("itemId", id); formData.append("orderId", this.orderId); formData.append("type", type); formData.append("belongOrder", blondId); console.log(formData); this.forms = formData;},// 创建请求uploadP() { let config = { headers: { //添加请求头 "Content-Type": "multipart/form-data", token: this.token } }; axios.post("/netgift/order/evaluation/addPicture", this.forms, config) .then(res => { let that = this; if (res.data.code == 0) { this.$Message.success({ content: res.data.msg, onClose: function() { that.$router.go(-1); } }); } else { this.$Message.error(res.data.msg); } });},注意:
因为append()方法是直接添加数据,不管原来是否有值,而set()方法是原来有的时候重新设置,没有的时候追加。有时候,为了避免重复提交或数据重复,使用set()方法会比较好。 遍历FormData的常用方法1.entries() 方法
FormData.entries() 方法返回一个 iterator对象 ,此对象可以遍历访问FormData中的键值对。其中键值对的key是一个 USVString 对象;value是一个 USVString , 或者 Blob对象。
示例:
加粗样式
详情可以看官方的api,传送门
2.keys();
3.values();
这些方法官方都有详细介绍 就不复制了
4.for循环的方式
var formData = new FormData();formData.append('key', 'value');for (var key in formData.keys()){ formData.delete(key);};参考链接:
http://www.cnblogs.com/gczmn/
https://blog.csdn.net/zqian1994/article/details/79635413
https://blog.csdn.net/sinat_34492035/article/details/80477858
免责声明:文章源自网络,版权归原作者所有,如有侵犯联系删除。