FormData类型其实是在XMLHttpRequest 2级定义的,它是为序列化表以及创建与表单格式相同的数据(当然是用于XHR传输)提供便利。
创建一个formData对象实例有几种方式
1.创建一个空对象实例
var formData = new FormData();
2.使用已有的表单来初始化一个对象实例
假如现在页面已经有一个表单
我们可以使用这个表单元素作为初始化参数,来实例化一个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");
首先,我们要明确formData里面存储的数据形式,一对key/value组成一条数据,key是唯一的,一个key可能对应多个value。如果是使用表单初始化,每一个表单字段对应一条数据,它们的HTML name属性即为key值,它们value属性对应value值。
2.1 获取值
我们可以通过get(key)/getAll(key)来获取对应的value,
formData.get("name"); // 获取key为name的第一个值
formData.get("name"); // 返回一个数组,获取key为name的所有值
2.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"]
2.3 设置修改数据
我们可以通过set(key, value)来设置修改数据,如果指定的key不存在则会新增一条,如果存在,则会修改对应的value值。
formData.append("k1", "v1");
formData.set("k1", "1");
formData.getAll("k1"); // ["1"]
2.4 判断是否该数据
我们可以通过has(key)来判断是否对应的key值
formData.append("k1", "v1");
formData.append("k2",null);
formData.has("k1"); // true
formData.has("k2"); // true
formData.has("k3"); // false
2.5 删除数据
通过delete(key),来删除数据
formData.append("k1", "v1");
formData.append("k1", "v2");
formData.append("k1", "v1");
formData.delete("k1");
formData.getAll("k1"); // []
2.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}
我们可以通过xhr来发送数据
var xhr = new XMLHttpRequest();
xhr.open("post","login");
xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
xhr.send(formData);
这种方式可以来实现文件的异步上传。
//添加数据方式见上二。
//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);
}
});
// 所填所有数据验证没有问题后,执行该回调函数
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);
}
});
},
注意:
1.entries() 方法
FormData.entries() 方法返回一个 iterator对象 ,此对象可以遍历访问FormData中的键值对。其中键值对的key是一个 USVString 对象;value是一个 USVString , 或者 Blob对象。
示例:
加粗样式
// Create a test FormData object
var formData = new FormData();
formData.append('key1', 'value1');
formData.append('key2', 'value2');
// Display the key/value pairs
for(var pair of formData.entries()) {
console.log(pair[0]+ ', '+ pair[1]);
}
详情可以看官方的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