FormData

Posted zcy9838

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了FormData相关的知识,希望对你有一定的参考价值。

1. FormData对象的作用:

① 模拟html表单,相当于将HTML表单映射成表单对象,自动将表单对象中的数据拼接成请求参数的格式

② 异步上传二进制文件

2. FormData对象的使用:

① 准备HTML表单

注意:

  • 这个表单不需要请求方式和请求地址,这些内容可以在Ajax中设置。
  • formdata对象不能用于get请求,因为formdata的数据要放到send()方法中,而get请求方式的请求参数只能放在请求地址的后面。
  • 表单中的input控件必须要有name属性,因为当我们把表单提交到服务器的时候,表单的name属性会作为请求参数的属性名字。
  • 表单中的提交按钮不是submit,如果是submit的话,点击会有默认的提交行为。
  • 表单对象的好处是,不需要我们单独的一个一个的去获取指定的表单控件的值。
<form id="form">
     <input type="text" name="username" />
     <input type="password" name="password" />
     <input type="button"/>
</form>

② 将HTML表单转化为formData对象

var form = document.getElementById(‘form‘); 
var formData = new FormData(form);

③ 提交表单对象

xhr.send(formData);

注意:服务器端bodyParser模块(用来处理post请求)不能解析formData对象表单数据,我们需要使用formidable模块进行解析

// 解析客户端传递过来的FormData对象
form.parse(req, (err, fields, files) => {...})
// 第一个参数是错误对象,第二个参数保存的是表单中普通的请求参数,第三个参数保存的是和文件上传相关的信息

3. FormData对象的实例方法:

① 获取表单对象中属性的值

formData.get(‘key‘);

② 设置表单对象中属性的值

formData.set(‘key‘, ‘value‘);

③ 删除表单对象中属性的值

删除属性的应用场景:输入两次密码(原密码和确认密码),但是提交给服务器的时候只用提交一份,所以需要删除掉确认密码。

formData.delete(‘key‘);

④ 向表单对象中追加属性值

formData.append(‘key‘, ‘value‘);

注意:set方法与append方法的区别是,在属性名已存在的情况下,set会覆盖已有键名的值,append会保留两个值

4. FormData二进制文件上传:

<input type="file" id="file"/>
var file = document.getElementById(‘file‘)
// 当用户选择文件的时候
file.onchange = function () {
     // 创建空表单对象
     var formData = new FormData();
     // 将用户选择的二进制文件追加到表单对象中
     formData.append(‘attrName‘, this.files[0]);
     // 配置ajax对象,请求方式必须为post
     xhr.open(‘post‘, ‘www.example.com‘);
     xhr.send(formData);
}

注意:用户选择的文件中的files属性是文件集合,即使只有一个值也是集合,需要用files[0]的形式表示(一般每次都只是选择一个文件上传)

formidable方法详解:https://www.cnblogs.com/yuanke/archive/2016/02/26/5221853.html

5. FormData文件上传进度展示:

<div class="progress">
    <div class="progress-bar" style="width: 0%;" id="bar">0%</div>
</div>
// 当用户选择文件的时候
file.onchange = function () {
     // 文件上传过程中持续触发onprogress事件
     xhr.upload.onprogress = function (ev) {
         // 当前上传文件大小/文件总大小 再将结果转换为百分数
         // 将结果赋值给进度条的宽度属性 
         bar.style.width = (ev.loaded / ev.total) * 100 + ‘%‘;
     }
}

6. FormData文件上传图片即时预览:

在我们将图片上传到服务器端以后,服务器端通常都会将图片地址做为响应数据传递到客户端,客户端可以从响应数据中获取图片地址,然后将图片再显示在页面中。

技术图片

注意:获取的文件地址是服务器端电脑的硬盘地址,但是我们是不能直接访问服务器端电脑的硬盘地址的,我们只需要访问uploads后面的相对路径

uploads文件夹存放在public静态资源文件夹下面,而静态文件是可以直接在地址栏访问的,所以在服务器端需要把文件路径进行处理:

以public为分隔符,截取后面的字符串,然后利用这个相对路径去显示图片。

注意,img.src赋值后不能直接将DOM元素追加到页面中,因为向服务器获取图片也需要时间,需要等到图片加载完之后才能追加。因此需要使用img.onload()

xhr.onload = function () {
     var result = JSON.parse(xhr.responseText);
     var img = document.createElement(‘img‘);
     // 给图片标签设置src属性
     img.src = result.src;
     // 当图片加载完成以后
     img.onload = function () {
         // 将图片显示在页面中
         document.body.appendChild(this);
     }
}

 

以上是关于FormData的主要内容,如果未能解决你的问题,请参考以下文章

FormData的介绍

如何使用 jQuery.ajax 和 FormData 上传文件

formdata怎么上传文件和数据

JSON对象转成formData对象,formData对象转成JSON对象

JSON对象转成formData对象,formData对象转成JSON对象

无法构造“FormData”[关闭]