pythonclass 2020-06-07
1. FormData对象的作用:
① 模拟HTML表单,相当于将HTML表单映射成表单对象,自动将表单对象中的数据拼接成请求参数的格式
② 异步上传二进制文件
2. FormData对象的使用:
① 准备HTML表单
注意:
<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);
}
} 在新项目中使用的是springboot编写的api,涉及到ajax跨域请求和传输文件的问题,在这里记录一下。<input type="button" onclick="test();" value="