您当前的位置:首页 > 互联网教程

前端小技巧:学会用FormData对象收集表单数据

发布时间:2025-05-19 11:58:50    发布人:远客网络

前端小技巧:学会用FormData对象收集表单数据

一、前端小技巧:学会用FormData对象收集表单数据

1、需求:是获取form表单中的用户名和密码并包装成一个对象

2、这个需求是我们大部分时候在发送ajax请求时需要做的一个工作。

3、可以看到,我们已经实现了需求,但是我们写的JS代码很繁琐,我们需要先获取form表单中input框元素,然后元素的value值,最后包装成一个对象。

4、通过这个例子你应该能感受到FormData的便利性,只需要 new FormData(form)一句代码就可以把form表单内的所有信息都以键值对的形式包装成一个对象返回。

5、 FormData对象是用来将form表单数据编译成键值对,这么做有两个好处:

6、 FormData对象可以帮我们更方便的收集表单数据并中的整理成对象,大大方便了我们发送ajax请求。

二、axios+post方法提交formdata步骤详解

这次给大家带来axios+post方法提交formdata步骤详解,axios+post方法提交formdata的注意事项有哪些,下面就是实战案例,一起来看一下。

vue框架推荐使用axios来发送ajax请求,之前我还写过一篇博客来讲解如何在vue组件中使用axios。但之前做着玩用的都是get请求,现在我自己搭博客时使用了post方法,结果发现后台(node.js)完全拿不到前台传来的参数。后来进过一番探索,终于发现问题所在。

1.application/x-www-form-urlencoded

这应该是最常见的post编码方式,一般的表单提交默认以此方式提交。大部分服务器语言对这种方式都有很好的支持。在PHP中,可以用$_POST[“key”]的方式获取到key的值,在node中我们可以使用querystring中间件对参数进行分离

app.post("/server"function(req,res){ req.on("data"function(data){ let key=querystring.parse(decodeURIComponent(data)).key; console.log("querystring:"+key)});});

这也是一种比较常见的post数据格式,我们用表单上传文件时,必须使form表单的enctype属性或者ajax的contentType参数等于multipart/form-data。使用这种编码格式时发送到后台的数据长得像这样子

不同字段以--boundary开始,接着是内容描述信息,最后是字段具体内容。如果传输的是文件,还要包含文件名和文件类型信息

axios默认提交就是使用这种格式。如果使用这种编码方式,那么传递到后台的将是序列化后的json字符串。我们可以将application/json与application/x-www-form-urlencoded发送的数据进行比较

接着是application/x-www-form-urlencoded:

这里可以明显看出application/x-www-form-urlencoded上传到后台的数据是以key-value形式进行组织的,而application/json则直接是个json字符串。如果在处理application/json时后台还是采用对付application/x-www-form-urlencoded的方式将会产生问题。

例如后台node.js依然采用之前对付application/x-www-form-urlencoded的方法,那么querystring.parse(decodeURIComponent(data))之后得到的数据是这样子的

这个时候再querystring.parse(decodeURIComponent(data)).key只能获取到undefined

剩下的一种编码格式是text/xml,这种格式我没有怎么使用过

既然我们知道axios post方法默认使用application/json格式编码数据,那么解决方案就有两种,一是后台改变接收参数的方法,另一种则是将axios post方法的编码格式修改为application/x-www-form-urlencoded,这样就不需要后台做什么修改了。

vue组件中,axios发送post请求的代码如下

this.$axios({ method:"post" url:"/api/haveUser" data:{ name:this.name, password:this.password}}).then((res)=>{ console.log(res.data);})

此时控制台Network Headers里面的信息是这样子的

后台接收数据需要依赖body-parser中间件,我们事先装好,接着在后台代码中引用body-parser

这张截图中,发挥作用的代码仅仅是const bodyParser=require("body-parser");

app.post("/api/haveUser"bodyParser.json(),function(req,res){ console.log(req.body); let haveUser=require("/api/server/user.js"); haveUser(req.body.name,req.body.password,res);});

这时,当前台发送post请求之后,后台控制台中就会打印出req.body

这时,通过req.body.name或者req.body.password就能拿到对应的值。

这种方法比较简单,也不需要前台做过多修改,推荐使用这种方法。

this.$axios({ method:"post" url:"/api/haveUser" headers:{'Content-type''application/x-www-form-urlencoded'}, data:{ name:this.name, password:this.password}, transformRequest: [function(data){ let ret='' for(let it in data){ ret+= encodeURIComponent(it)+'='+ encodeURIComponent(data[it])+'&'} return ret}],}).then((res)=>{ console.log(res.data);})

其中发挥关键作用的是headers与transformRequest。其中 headers是设置即将被发送的自定义请求头。 transformRequest允许在向服务器发送前,修改请求数据。这样操作之后,后台querystring.parse(decodeURIComponent(data))获取到的就是类似于{ name:'w' password:'w'}的对象。

app.post("/api/haveUser"function(req,res){ let haveUser=require("/api/server/user.js"); req.on("data"function(data){ let name=querystring.parse(decodeURIComponent(data)).name; let password=querystring.parse(decodeURIComponent(data)).password; console.log(name,password) haveUser(name,password,res);});});

这种方法明显就要比第一种麻烦一点,但不需要后台做过多处理。所以具体操作还是得根据实际情况决定。

三、lrz.js quality 设置多大

quality:0.7,//图片压缩质量,取值 0- 1,默认为 0.7

width:800,//设置图片压缩后的最大宽度,默认为原图宽度

quality:0.7,//图片压缩质量,取值 0- 1,默认为 0.7

fieldName:"aijquery"//后端接收的字段名,默认:file,一般不用这项,我们要上传数据的话,可以自定义FormData对象

rst.formData//后端可处理的数据

rst.file//压缩后的file对象,如果压缩率太低,将会是原始file对象

rst.fileLen//压缩后的图片的大小,

rst.base64//生成后的图片base64,后端可以处理此字符串为图片,也可以直接用于 img.src= base64

rst.base64Len//生成后的base64的大小,后端可以通过此值来校验是否传输完整

rst.origin//原始的file对象,里面存放了一些原始文件的信息,例如大小、日期等

}).catch(function(err){//处理失败后执行

}).always(function(){//必然执行