FormData

FormData对象的作用(不能用于post请求)

  1. 模拟HTML表单,相当于将HTML表单映射成表单对象,自动将表单对象中的数据拼接成请求参数的格式。
  2. 异步上传二进制文件

FormData对象的使用

在这里插入图片描述
在这里插入图片描述
bodyparse不能处理客户端向服务器端传递的FormData对象。用formidable

app.post('/formData', (req, res) => {
	// 创建formidable表单解析对象
	const form = new formidable.IncomingForm();
	// 解析客户端传递过来的FormData对象
	form.parse(req, (err, fields, files) => {
		res.send(fields);
	});
});
//获取按钮
		var btn = document.getElementById('btn');
		//获取表单
		var form = document.getElementById('form');
		//为按钮添加点击事件
		btn.onclick = function () {
			//将普通的html表单转换为表单对象
			var formData = new FormData(form);
			//创建ajax对象
			var xhr = new XMLHttpRequest();
			//对ajax对象进行配置
			xhr.open('post', 'http://localhost:3000/formData');
			//发送ajax请求
			xhr.send(formData);
			//监听xhr对象下面的onload事件
			xhr.onload = function () {
				//对http状态码进行判断
				if (xhr.status == 200) {
					//获取服务器端的响应数据
					console.log(xhr.responseText);
				}
			}
		}

FormData对象的实例方法

在这里插入图片描述

/*
			
				get('key') 获取表单对象属性的值
				set('set') 设置表单对象属性的值
			 */
			console.log(formData.get('username'));
			//如果设置的表单属性存在 将会覆盖属性原有的值
			formData.set('username', 'itcast');
			//如果设置的表单属性不存在 将会创建这个表单属性
			formData.set('age', 20);

在这里插入图片描述

FormData二进制文件上传

所谓二进制文件是指图片,视频,音频的文件
在这里插入图片描述

FormData文件上传进度展示

在这里插入图片描述

FormData文件上传图片即使预览

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

//实现文件上传的路由
app.post('/upload', (req, res) => {
	// 创建formidable表单解析对象
	const form = new formidable.IncomingForm();
	//设置客户端上传文件的绝对路径
	form.uploadDir = path.join(__dirname,'public','uploads');
	//保留上传文件的后缀名字
	form.keepExtensions = true;
	// 解析客户端传递过来的FormData对象
	form.parse(req, (err, fields, files) => {
		//将服务器传递过来的文件地址响应到客户端
		//服务器端返回的数据
		res.send({
			path: files.attrName.path.split('public')[1]
		});
	});

});

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
	<link rel="stylesheet" href="/assets/bootstrap/dist/css/bootstrap.min.css">
	<style type="text/css">
		.container {
			padding-top: 60px;
		}
		.padding {
			padding: 5px 0 20px 0;
		}
	</style>
</head>
<body>
	<div class="container">
		<div class="form-group">
			<label>请选择文件</label>
			<input type="file" id="file">
			<br/>
			<div class="padding" id="box">
				<!-- <img src="" class="img-rounded img-responsive"> -->
			</div>
			<div class="progress">
				<div class="progress-bar" style="width: 60%;" id="bar">0%</div>
			</div>
		</div>
	</div>
	<script>
		//获取文件选择空间
		var file = document.getElementById('file');
		//获取进度条元素
		var bar = document.getElementById('bar');
		//获取图片容器
		var box = document.getElementById('box');

		//为文件选择空间添加onchanges事件
		//在用户选择文件时触发
		file.onchange = function () {
			//创建空的表单对象
			var formData = new FormData();
			//将用户选择的文件追加到formData表单对象中
			formData.append('attrName',this.files[0]);
			//创建ajax对象
			var xhr = new XMLHttpRequest();
			//对ajax对象进行配置
			xhr.open('post', 'http://localhost:3000/upload');
			//在文件上传的过程中持续触发
			xhr.upload.onprogress = function(ev) {
				// console.log(ev);
				// ev.loaded 文件已经上传了多少
				// ev.total上传文件的总大小
				var result = (ev.loaded / ev.total) * 100 + '%';
				//设置进度条的宽度
				bar.style.width = result;
				//将百分比显示在进度条中
				bar.innerHTML = result;
			}
			//发送ajax请求
			xhr.send(formData);
			//监听服务器端响应给客户端的数据
			xhr.onload = function () {
				//如果服务器端返回的http状态码是200
				//说明请求成功
				if (xhr.status == 200) {
					//将服务器端返回的数据显示在控制台中
					var result = JSON.parse(xhr.responseText);
					//动态创建img标签
					var img = document.createElement('img');
					//给图片标签设置src属性
					img.src = result.path;
					//当图片加载完成之后将图片显示在页面中
					img.onload = function () {
						box.appendChild(img);
					}
				}
			}

		}
	</script>
</body>
</html>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值