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); } }