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());
}
  1. consumes:表示此接口只能接收的请求体类型(Content-Type)是 multipart/form-data;
  2. RequestBody:因为 POST 请求方式的数据都是在请求体(Body)中,所以用此注解接收数据;
  3. MultipartFile:解析 multipart/form-data 的数据。

FormData 和表单元素(form)的区别的更多相关文章

  1. html之表单元素form

    表单元素form \(都是嵌套input标签来实现,其中type属性选择不同则不同\) \(text:文本内容(输入内容可见)\) \(password:密码(输入内容不可见)\) \(submit: ...

  2. 关于struts中的表单元素- Form bean not specified on mapping for action: "helloa.do"报错

    今天测试struts时仿照书上写了一个小的表单提交代码 <html:form action="helloa.do" method="post"> & ...

  3. 遍历form表单里面的表单元素,取其value

    form.elements 获取所有表单元素 form 表单 <form action="http://localhost:1995/api/post" class=&quo ...

  4. PHP(表单元素)

    表单: 1.收集用户的输入,发送到后台 <form action="后台地址" method="提交方式" enctype="multipart ...

  5. HTML5 表单元素和属性

    HTML5 表单元素和属性学习 版权声明:未经博主授权,内容严禁转载 ! 表单元素简介 无论实现提交功能还是展示页面功能,表单在HTML中的作用都十分重要. 在其他版本的HTML中,表单能够包含的元素 ...

  6. 9月8日HTML表单元素(form、文本、按钮、选择)

    表单元素 一.form form代表表单,功能:用于申明表单,定义采集数据的范围,也就是<form>和</form>里面包含的数据将被提交到服务器或者电子邮件里.<for ...

  7. form表单 无法提交js动态添加的表单元素问题。。

    第一种情况, 这种情况js动态添加的表单元素是不能提交到服务器端的 <table> <form method="post" action=" url   ...

  8. 表单组件 form fastadmin(生成表单元素)

    Form组件 定义文件位置: /extend/fast/Formphp 通用参数 $name 通常为我们组件的名称(name属性值),我们在后台接收时可以通过这个名称来获取到它所对应的值 $value ...

  9. 【jQuery】form表单元素序列化为json对象

    序列化form表单元素为json对象: <!Doctype html> <html xmlns=http://www.w3.org/1999/xhtml> <head&g ...

随机推荐

  1. 用STM32玩SR04(测距、串口显示、OLED显示)

    目录 用STM32玩SR04(测距.串口显示.OLED显示) 超声波模块使用 SR04初始化 SR04使用串口打印数据 SR04使用OLED来传输数据,并显示在OLED上 用STM32玩SR04(测距 ...

  2. 解惑unittest框架中导入HTMLTestRunner模块后正常运行却无法生成HTML报告问题

    1.HTMLTestRunner介绍 HTMLTestRunner是一个第三方的unittest HTML报告库,用于python单元测试框架的TestRunner.它是生成一个HTML报告,以一目了 ...

  3. DirectX11 With Windows SDK--19(Dev) 编译Assimp并加载模型、新的Effects框架

    前言 注意:这一章进行了重写,对应教程Dev分支第19章的项目,在更新完后面的项目后会替换掉原来第19章的教程 在前面的章节中我们一直使用的是由代码生成的几何模型,但现在我们希望能够导入模型设计师生成 ...

  4. 【zigbee无线通信模块步步详解】ZigBee3.0模块建立远程网络控制方法

    本文以路灯控制应用为例,简述ZigBee3.0模块使用流程. 一.建立网络 1.通过USB转串口模块将出厂的ZigBee自组网模块连接,打开上位机软件"E180-ZG120A-Setting ...

  5. python亲密数设计

    '''亲密数 (如果a的所有正因子和等于b,b的所有正因子和等于a,因子包括1但不包括本身,且a不等于b,则称a,b为亲密数对.一般通过叠代编程求出相应的亲密数对)'''n = 3000def fun ...

  6. mysql调优学习笔记

    性能监控 使用show profile查询剖析工具,可以指定具体的type 此工具默认是禁用的,可以通过服务器变量在绘画级别动态的修改 set profiling=1; 当设置完成之后,在服务器上执行 ...

  7. 简单到爆——用Python在MP4和GIF间互转,我会了

    写在前面的一些P话: 昨天用公众号写文章的时候,遇到个问题.我发现公众号插入视频文件太繁琐,一个很小的视频,作为视频传上去平台还要审核,播放的时候也没gif来的直接.于是想着找个工具将mp4转换成gi ...

  8. Linux YUM 配置源

    Linux Yum 简介 YUM是交互式的以rpm为基础的软件包管理工具.YUM可以根据仓库的元数据信息,去自动的实现系统更新,包括依赖性分析,过期软件包处理.我们也可以利用yum来进行软件安装,删除 ...

  9. Session会话 Cookie JSTL标签

    Cookie  1) HTTP是无状态协议(连接结束后就自动断开),服务器不能记录浏览器的访问状态,也就是说服务器不能区分中两次请求是否由一个客户端发出.这样的设计严重阻碍的Web程序的设计.如:在我 ...

  10. 适用于MES、WMS、ERP等管理系统的实体下拉框设计

    场景 该设计多适用于MES,ERP,WMS 等管理类型的项目. 在做管理类型项目的时候,前端经常会使用到下拉框,比如:设备,工厂等等.下拉组件中一般只需要他们的ID,Name属性,而这些数据都创建于其 ...