js中的Formdata数据结构

一、基本概念

FormData 提供了一种表示表单数据的 key/value 的构造方式,主要方便我们用 XMLHttpRequest 来发送数据。我们主要用它来作为上传文件的接口数据,因为结合 ‘multipart/form-data’ 请求类型,能实现与后端的流式传输。
构造函数:FormData(form?: HTMLFormElement, submitter?: (HTMLElement | null))

  • form:表单dom元素
  • submitter:提交按钮dom元素

实例化:const formdata = new FormData()

二、常用方法

1.append(name, value)、set(name, value)

append(name: string, value: string | Blob)
append(name: string, value: string | Blob)
append可以给FormData添加数据(支持字符串以及文件Blob类型数据),如果name存在则是追加一条数据。这里我们要与常规的对象数据结构区分开了,FormData的key不是唯一的,它可以存在多个相同的key。

const formData = new FormData()
formData.append('name', '张三')
formData.append('name', '李四')
formData.append('name', '王五')

注意:这里的值并不会相互覆盖,而是不断地追加到FormData中
set同样可以给formData添加数据,但是如果name存在,则会修改数据

const formData = new FormData()
formData.set('name', '张三')
formData.set('name', '李四') // 会覆盖前面的值

formData.append('age', '11')
formData.set('age', '12') // 会覆盖前面的值

2.get()、getAll()

获取数据,区别就是get是获取name下的第一个值,而getAll则获取所有值

const formData = new FormData()
formData.append('age', '11')
formData.append('age', '33')
console.log(formData.get('age')); // 11
console.log(formData.getAll('age')); // ['11', '33']
formData.set('age', '12')
formData.set('age', '22')
console.log(formData.get('age')); // 22
console.log(formData.getAll('age')); // ['22']

3.has(name)

判断是否有FormData中是否包含name

const formData = new FormData()
formData.append('age', '33')
console.log(formData.has('age')); // true
console.log(formData.has('name')); // false

4.delete(name)

删除某个name属性,即使你append了多个相同的name属性,也会全部删除。

const formData = new FormData()
formData.append('age', '11')
formData.append('age', '33')
formData.delete('age') // []
console.log(formData.getAll('age'));
formData.set('name', '张三')
formData.delete('name')
console.log(formData.getAll('name')); // []

5.keys(),values(),entries()

获取FormData中的所有key、所有value和所有的[key,value]的iterator对象

  const formData = new FormData()
  formData.append('age', '11')
  formData.append('age', '33')
  formData.set('name', '张三')
  formData.set('name', '李四')
  const keys = formData.keys()
  console.log(keys);
  console.log([...keys]);
  const values = formData.values()
  console.log(values);
  console.log(...values);
  const entries = formData.entries()
  console.log(entries);
  console.log([...entries]);

在这里插入图片描述

我们可以看到,key是有多个的。

三、其他细节

1.for of遍历

FormData本身就是一个Iterator对象,所以我们可以直接使用for of遍历,同样也可以直接使用 …运算符展开。

  const formData = new FormData()
  formData.append('age', '11')
  formData.append('age', '33')
  formData.set('name', '张三')
  for (const item of formData) {
    console.log(item)
  }
  console.log([...formData]);
  const entries = formData.entries()
  console.log([...entries]);

在这里插入图片描述

事实上,FormData的iterator遍历返回的值就是formData.entries()

2.转为对象

FormData也可以快捷的转为常规对象数据,但是对象的key是唯一的,所以FormData重复的数据会丢失

  const formData = new FormData()
  formData.append('age', '11')
  formData.append('age', '33')
  formData.set('name', '张三')
  console.log(Object.fromEntries(formData.entries()));

在这里插入图片描述

3.结合 URLSearchParams 转为queryString

因为FormData本身就是为了方便前端与后端进行接口交互的,所以可以直接作为实例化 URLSearchParams的参数,然后转为queryString。
不过这种场景现实情况中用的不多,毕竟大家还是主要用FormData进行文件上传。

  const formData = new FormData()
  formData.append('age', '11')
  formData.append('age', '33')
  formData.set('name', '张三')
  console.log(new URLSearchParams(formData).toString())
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Node.js的Web开发,上传文件一般使用FormData对象来进行处理。当客户端使用FormData对象提交表单数据时,服务器端需要使用间件解析请求体的数据。koa-body是一个常用的间件,用于解析请求体的数据。 当使用koa-body间件解析上传文件的FormData数据时,koa-body会将上传的文件数据解析为一个对象,该对象的结构如下: ``` { files: { fieldname: [ { name: 'filename', path: 'filepath', type: 'filetype', size: filesize, hash: filehash } ] }, fields: { fieldname: fieldvalue } } ``` 其,files属性代表上传的文件,fields属性代表上传的其他字段数据。fieldname代表上传文件或字段的名称,name代表上传文件的文件名,path代表上传文件的保存路径,type代表上传文件的MIME类型,size代表上传文件的大小,hash代表上传文件的哈希值。 例如,以下是一个上传文件的示例代码: ``` const koaBody = require('koa-body'); const Koa = require('koa'); const app = new Koa(); app.use(koaBody({ multipart: true })); app.use((ctx, next) => { if (ctx.request.method === 'POST' && ctx.request.path === '/upload') { const files = ctx.request.body.files; const fields = ctx.request.body.fields; console.log(files); console.log(fields); ctx.body = 'Upload Success'; } else { ctx.body = 'Hello World'; } }); app.listen(3000); ``` 该示例,使用koa-body间件解析上传文件的FormData数据,并在控制台输出解析后的文件和字段数据。当客户端向服务器发送POST请求,上传文件时,服务器会将上传文件的数据解析为files对象。如果上传的数据包含其他字段数据,那么服务器也会将其解析为fields对象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值