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>

<think>我们正在讨论如何使用FormData对象进行表单数据收集和提交。根据引用[1]和[2],我们可以知道FormData是JavaScript中用于处理表单数据的API,它可以直接从表单元素创建,也可以手动添加数据,并且支持文件上传。同时,引用[3]提到了在Spring MVC中处理嵌套表单数据,但用户的问题主要集中在前端部分。 用户的问题:如何在前端使用FormData对象进行表单数据收集和提交? 回答步骤: 1. 创建FormData对象:可以从表单元素创建,也可以手动创建并添加数据。 2. 添加数据:可以通过append方法添加额外的数据。 3. 提交数据:使用fetch或XMLHttpRequest发送FormData对象。 注意:引用[1]提供了FormData的基本用法,引用[2]展示了表单的HTML结构,我们可以结合两者。 另外,用户要求使用中文回答,并且按照系统级指令处理数学表达式(但本问题不涉及数学表达式,所以可以忽略),同时需要生成相关问题。 回答结构: - 先介绍FormData的基本概念和用途。 - 分步骤说明如何收集表单数据(包括从表单创建和手动添加)。 - 分步骤说明如何提交数据(使用fetch示例)。 - 简要比较FormData和JSON格式(根据引用[1]中的比较表,但用户主要问操作,所以简单提及即可)。 - 最后生成相关问题。 由于引用[3]是关于后端处理嵌套表单的,与用户问题关系不大,可以忽略。 下面开始组织回答:</think>### 如何使用 FormData 对象进行表单数据收集和提交 #### 一、FormData 基础操作 1. **从表单创建 FormData 对象** 通过 `querySelector` 获取表单元素,直接生成 FormData 对象: ```javascript const form = document.querySelector('#myForm'); // 获取表单元素 const formData = new FormData(form); // 自动收集所有带 name 属性的表单控件 ``` 2. **手动添加数据** 使用 `append()` 方法添加额外字段(支持文本/文件): ```javascript formData.append('timestamp', Date.now()); // 文本数据 formData.append('avatar', fileInput.files[0]); // 文件数据 ``` 3. **操作表单数据** - 获取值:`formData.get('username')` - 删除字段:`formData.delete('temp_field')` - 检查存在:`formData.has('email')` #### 二、提交表单数据 使用 `fetch` 发送数据(支持文件上传): ```javascript fetch('/api/submit', { method: 'POST', body: formData // 自动设置 Content-Type 为 multipart/form-data }) .then(response => response.json()) .catch(error => console.error('提交失败', error)); ``` #### 三、特殊场景处理 1. **动态表单字段** 循环添加多个字段: ```javascript const tags = ['js', 'web', 'api']; tags.forEach(tag => formData.append('tags[]', tag)); // 后端接收数组 ``` 2. **文件上传** ```html <input type="file" id="doc" name="document" multiple> <!-- 多文件选择 --> ``` ```javascript const files = document.getElementById('doc').files; Array.from(files).forEach(file => formData.append('docs', file)); ``` 3. **嵌套数据结构** 需后端配合解析(如 Spring MVC 的 `@ModelAttribute`): ```javascript formData.append('user.profile.bio', '前端开发者'); // 点语法表示嵌套 ``` #### 四、与 JSON 提交对比 | 特性 | FormData | JSON | |---------------|------------------------------|---------------------| | 文件支持 | ✅ 原生 | ❌ 需 Base64 编码 | | 内容类型 | `multipart/form-data` | `application/json` | | 数据结构 | 扁平键值对 | 复杂嵌套结构 | | 编码效率 | 更高(二进制直接传输) | 较低(文本编码) | > 优先选择 FormData 的场景:包含文件上传、需要兼容旧表单、简化数据编码流程[^1][^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值