FormData 和表单元素(form)的区别
Form 元素
<form>元素表示文档中的一个区域,此区域包含交互控件,用于向 Web 服务器提交信息(文件、字符)。下面称之为表单元素或表单。
要向 Web 服务器提交信息,我们必须要给表单内添加几个<input>元素;它有一个用于指定提交信息的类型的属性type,如:text、password、file 等。
表单本身有提交属性action,指的是表单内的信息提交的 Web 服务器的请求地址:
<form id="form" action="http://localhost:8080/upload/user/info">
<input id="uname" type="text" name="uname" />
<input id="pwd" type="password" name="pwd" />
<button type="submit">submit</button>
</form>
当点击按钮(类型为 submit)时,表单就打包信息然后发送action属性指定的 Web 服务器进行处理。
FormData
FormData 是一个接口,用它提交信息给 Web 服务器最终的效果是一样的。直接用表单元素可以不用 JS 代码就可以实现提交信息的功能。有了 FormData 自由度更高,本身提供了许多的方法供我们使用。
FormData 数据结构
仔细观察可以知道,表单元素其实就是一个 key/value 的集合,所以,FormData 也是这样的集合。FormData 接口只提供封装信息的能力,数据发送实际是交给XMLHttpRequest来处理的。
XMLHttpRequest.send(body)可以接收几种类型的数据,其中之一就是 FormData。
append() 和 set()
| 函数 | 作用 | 区别 |
|---|---|---|
| set(name, value) | 添加一个键值对到 FormData 中 | 如果有相同的 name(key),覆盖上一次的所有值 |
| append(name, value) | 添加一个键值对到 FormData 中 | 如果有相同的 name(key),追加到 value 后面 |
append 和 set 都可以添加数据到 FormData 中。但是实际使用中有着很大的区别,下面将通过实验来证明。
set
formData.set('hobbies', 'football');
console.log(`第一次 value:${formData.getAll('hobbies')}`);
formData.set('hobbies', 'animation');
console.log(`第二次 value:${formData.getAll('hobbies')}`);

append
formData.append('hobbies', 'football');
console.log(`第一次 value:${formData.getAll('hobbies')}`);
formData.append('hobbies', 'animation');
console.log(`第二次 value:${formData.getAll('hobbies')}`);

通过实验证明,如果第二次添加的 key 与第一次的 key 是相同的,set 会覆盖第一次 value 中的数据;append 会追加到 value 之后。
多文件上传
前端
<div id="app">
<input @change="selected($event)" type="file" multiple />
<button @click="submit">提交</button>
</div>
Vue.createApp({
data() { return { files: [] }; },
methods: {
selected(e) { this.files = e.target.files; },
submit() {
let formData = new FormData();
for (let index in this.files) { formData.append(`files`, this.files[index]); }
axios.post('http://localhost:8080/upload/files', formData, {
headers: { 'content-type': 'multipart/form-data' }
});
}
}
}).mount('#app');
后端
MultipartFile
前端发送的请求体类型(Content-Type)是 multipart/form-data,需要用 MultipartFile 来解析。官方对 MultipartFile 的定义:Spring Web - MultipartFile。
编写接口
@PostMapping(value = "/upload/files", consumes = "multipart/form-data")
public void uploadFiles(@RequestParam("files") MultipartFile[] files) {
System.out.println(files[0].getOriginalFilename());
System.out.println(files[1].getOriginalFilename());
}
- consumes:表示此接口只能接收的请求体类型(Content-Type)是 multipart/form-data;
- RequestBody:因为 POST 请求方式的数据都是在请求体(Body)中,所以用此注解接收数据;
- MultipartFile:解析 multipart/form-data 的数据。

FormData 和表单元素(form)的区别的更多相关文章
- html之表单元素form
表单元素form \(都是嵌套input标签来实现,其中type属性选择不同则不同\) \(text:文本内容(输入内容可见)\) \(password:密码(输入内容不可见)\) \(submit: ...
- 关于struts中的表单元素- Form bean not specified on mapping for action: "helloa.do"报错
今天测试struts时仿照书上写了一个小的表单提交代码 <html:form action="helloa.do" method="post"> & ...
- 遍历form表单里面的表单元素,取其value
form.elements 获取所有表单元素 form 表单 <form action="http://localhost:1995/api/post" class=&quo ...
- PHP(表单元素)
表单: 1.收集用户的输入,发送到后台 <form action="后台地址" method="提交方式" enctype="multipart ...
- HTML5 表单元素和属性
HTML5 表单元素和属性学习 版权声明:未经博主授权,内容严禁转载 ! 表单元素简介 无论实现提交功能还是展示页面功能,表单在HTML中的作用都十分重要. 在其他版本的HTML中,表单能够包含的元素 ...
- 9月8日HTML表单元素(form、文本、按钮、选择)
表单元素 一.form form代表表单,功能:用于申明表单,定义采集数据的范围,也就是<form>和</form>里面包含的数据将被提交到服务器或者电子邮件里.<for ...
- form表单 无法提交js动态添加的表单元素问题。。
第一种情况, 这种情况js动态添加的表单元素是不能提交到服务器端的 <table> <form method="post" action=" url ...
- 表单组件 form fastadmin(生成表单元素)
Form组件 定义文件位置: /extend/fast/Formphp 通用参数 $name 通常为我们组件的名称(name属性值),我们在后台接收时可以通过这个名称来获取到它所对应的值 $value ...
- 【jQuery】form表单元素序列化为json对象
序列化form表单元素为json对象: <!Doctype html> <html xmlns=http://www.w3.org/1999/xhtml> <head&g ...
随机推荐
- camunda开源流程引擎的数据库表结构介绍
Camunda bpm流程引擎的数据库由多个表组成,表名都以ACT开头,第二部分是说明表用途的两字符标识.本文以Camunda7.11版本为例,共47张表. ACT_RE_*: 'RE'表示流程资源存 ...
- ExtJS 布局-Border 布局(Border layout)
更新记录: 2022年6月11日 发布. 2022年6月1日 开始. 1.说明 边框布局允许根据区域(如中心.北部.南部.西部和东部)指定子部件的位置.还可以调整子组件的大小和折叠. 2.设置布局方法 ...
- windiws下安装Composer
1.先下载Composer-Setup.exe,下载地址:下载Composer .会自动搜索php.exe的安装路径,如果没有,就手动找到php路径下的php.exe. 2.在PHP目录下,打开php ...
- java标识符 identifier
1,标识符 --> 类名 方法名 变量名 常量名 接口名 为程序员自己命名的内容 main也是标识符但是不能修改 2, 命名规则 只能以 数字 字母(中文) 下划线 美元符号 ...
- GitHub-SSH密钥获取
SSH密钥 需要先安装git的客户端,下载: http://git-scm.com/download/ 使用下列步骤完成密钥的添加. 检查系统是否存在密钥 运行 Git Bash, 在弹出的终端中输入 ...
- 配置Apollo阿波罗.net core 3.1 c#
直接上代码: public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(a ...
- 《吐血整理》保姆级系列教程-玩转Fiddler抓包教程(2)-初识Fiddler让你理性认识一下
1.前言 今天的理性认识主要就是讲解和分享Fiddler的一些理论基础知识.其实这部分也没有什么,主要是给小伙伴或者童鞋们讲一些实际工作中的场景,然后隆重推出我们的猪脚(主角)-Fiddler. 1. ...
- 漫谈客户端存储技术之Cookie篇
Cookie 说到Cookie,不管作为前端开发人员还是后端开发人员并不陌生,作为一种最古老.最稳定的客户端存储形式,即便是在当下各种新的客户端存储技术层出不穷的时代,它仍旧有其一席之位.Cookie ...
- 如何在.Net Framework应用中请求HTTP2站点
背景介绍 本文的需求背景是对接苹果公司的推送服务(APNS),苹果在安全方面比较积极,已经严格限制API只支持HTTP2.但是我这里的应用目前仍然是.NET Framework平台,所以必须寻找一种解 ...
- 综合案例_文件搜索和FileFilter过滤器的原理和使用
文件搜索 需求 : 遍历D:\aaa文件夹,及 aaa 文件夹的子文件夹并且只要.java结尾的文件 分析: 1.目录搜索,无法判断多少级目录,所以使用递归,遍历所有目录 2.遍历目录时,获取的子文件 ...