使用formData实现内容和文件上传

一、FormData简介

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,

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}
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对象。
示例:
加粗样式

// 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

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值