当前位置: 首页 > news >正文

前端 | FormData 用法详解

前端 | FormData 用法详解

介绍

​FormData 是 Ajax2.0 对象用以将数据编译成键值对,以便于 XMLHttpRequest 来发送数据。XMLHttpRequest Level 2 提供的一个接口对象,可以使用该对象来模拟和处理表单并方便的进行文件上传操作

如果表单属性设为 multipart/form-data,则会使用表单的 submit() 方法来发送数据,从而发送数据具有同样形式。

FormData 的主要用途有两个:

  1. 将form表单元素的name与value进行组合,实现表单数据的序列化,从而减少表单元素的拼接,提高工作效率。
  2. 异步上传二进制文件

使用方法

  • 创建一个空的对象
// 当前为空
var formData = new FormData();// 通过 append 方法添加数据
formData.append("username", "username");
  • 创建一个带预置数据的对象
<form id="myForm" action="" name="myForm"><div><label for="username">用户名:</label><input type="text" id="username" name="username"></div><div><label for="password">密码:</label><input type="password" id="password" name="password"></div><div><input type="submit" value="提交"></div>
</form>

注意
所有的输入元素都需要有 name 属性,否则无法访问到值。

// 获取页面已有的一个form表单
var form = document.getElementById("myForm");// 用表单来初始化
var formData = new FormData(form);// 根据 name 属性来访问对象中的字段
var username = formData.get("username");// 在此基础上添加其它数据
formData.append("token","abcdefghijklmnopqrstuvwxyz");

实际应用

DOM 文档部分

<!--HTML部分-->
<form action=""><label for="">姓名: <input type="text" name="name"></label><label for="">文件:<input id="file" type="file" name="file"></label><label for=""><input type="button" value="保存"></label>
</form>

原生 js 上传文件

// 获取按钮
var btn = document.querySelector('[type=button]');
//绑定事件
btn.onclick = function () {// 文件元素var file = document.querySelector('[type=file]');// 通过FormData将文件转成二进制数据var formData = new FormData();// 将文件转二进制formData.append('upload', file.files[0]);//创建XMLHttpRequest,用这个来发送数据var xhr = new XMLHttpRequest;/*初始化HTTP请求参数(请求方式,url,是否同步)*/xhr.open('post', 'file.php');/*xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");设置请求头的contentType*/// 监听上传进度xhr.upload.onprogress = function (ev) {// 事件对象// console.log(ev);var percent = (ev.loaded / ev.total) * 100 + '%';console.log(percent);progress.style.width = percent;}xhr.send(formData);xhr.onreadystatechange = function () {//status状态为200 表示请求成功,readystate为4表示对象传递完毕或者准备就绪 if(xhr.readyState == 4 && xhr.status == 200) {}}
}

API

  • FormData.append()

通过 append(key,value) 来添加数据,如果指定的 key 不存在则会新增一条数据,如果key存在,则追加到数据末尾。

FormData.setappend() 的区别在于,如果指定的键已经存在, FormData.set 会使用新值覆盖已有的值,而 append() 会把新值添加到已有值集合的后面。

语法

// name: value中包含的数据对应的表单名称
// value: 表单的值。可以是USVString 或 Blob (包括子类型,如 File)。
// filename (可选): 传给服务器的文件名称 (一个 USVString), 当一个 Blob 或 File 被作为第二个参数的时候, Blob 对象的默认文件名是 "blob"。 File 对象的默认文件名是该文件的名称。
formData.append(name, value);
formData.append(name, value, filename);

示例

// 创建空对象
var formData = new FormData();// 通过 FormData.append 往对象里加入键值对:
formData.append('name', 'name1');
formData.append('file', myFileInput.files[0], 'file1.jpg');// 跟常规表单数据一样,你可以使用同一个名称添加多个值 
formData.append('file', myFileInput1.files[0], 'file1.jpg');
formData.append('file', myFileInput2.files[0], 'file2.jpg');// 获取同一键名的所有值, 如:[myFileInput1.files[0], myFileInput2.files[0]]
formData.getAll("file"); 
  • FormData.get/getAll()

get() 方法用于返回FormData对象中和指定的键关联的第一个值,如果你想要返回和指定键关联的全部值,那么可以使用 getAll() 方法。

getAll() 方法会返回该 FormData 对象指定 key 的所有值。

语法

// name: 将要获取值的键名
// 返回值: 包含值的FormDataEntryValue (en-US)。
formData.get(name);

示例

// 创建一个空对象
var formData = new FormData();// 使用 FormData.append 方法添加数据
formData.append('username', 'name1');// 获取 key 为name的第一个值
formData.get('username'); // "name1"// 返回一个数组,获取 key 为 name 的所有值
formData.getAll("username"); // ["name1"]
  • FormData.delete()

delete() 方法会从 FormData 对象中删除指定键,即 key,和它对应的值,即 value

语法

// name: 要删除的键(Key)的名字
formData.delete(name);

示例

// 创建一个带有预设值的对象
var formData = new FormData(myForm);// 从 formData 对象中移除键名为 username 的数据
formData.delete('username');
  • FormData.set()

给 FormData 设置属性值,如果FormData 对应的属性值存在则覆盖原值,否则新增一项属性值。

语法

// name: 字段名称
// value:字段的值,如果是传入两个参数的方式,那么该值是一个 USVString,如果不是,将被转成一个字符串。如果是传入三个参数的方式,那么该值将是一个布尔值(Blob),文件(File),或者一个 USVString,如果不是,将被转成一个字符串。
// filename(可选): 当第二个参数传递的是一个blob对象(Blob)或者file对象(File),filename参数就代表传给服务端的文件名(一个USVString)。Blob 对象的默认文件名是 "blob"。// 该方法有两种使用方式,一个是传入两个参数,一个是传入三个参数。
formData.set(name, value);
formData.set(name, value, filename);

示例

// 创建一个空对象
var formData = new FormData();formData.set('username', 'linzy');
formData.set('pic', myFileInput.files[0], 'pic.jpg');
  • FormData.has()

has() 方法会返回一个布尔值,表示该 FormData 对象是否含有某个 key

语法

formData.has(name);

示例

// 创建一个空对象
var formData = new FormData();formData.has('username'); // falseformData.append('username', 'linzy');
formData.has('username'); // true
  • FormData.entries()

FormData.entries() 方法返回一个 iterator 对象 ,此对象可以遍历访问 FormData 中的键值对。其中键值对的key是一个 USVString 对象;value 是一个 USVString , 或者 Blob 对象。

语法

formData.entries();

示例

var formData = new FormData();formData.append('key1', 'value1');
formData.append('key2', 'value2');// 每调用一次 next()返回一条数据,数据的顺序由添加的顺序决定
// 返回的是一个对象,当其 done 属性为 true 时,说明已经遍历完所有的数据,这个也可以作为判断的依据
// 返回的对象的 value 属性以数组形式存储了一对key/value,数组下标0为key,下标1为value,如果一个key值对应多个value,会变成多对key/value返回
var i = formData.entries();
i.next(); // {done:false, value:["key1", "value1"]}
i.next(); // {done:fase, value:["key2", "value2"]}
i.next(); // {done:true, value:undefined}// 方式二
for(var pair of formData.entries()) {console.log(pair[0]+ ', '+ pair[1]);
}
// key1, value1
// key2, value2
  • FormData.keys()

FormData.keys() 该方法返回一个迭代器(iterator),遍历了该 formData 包含的所有 key ,这些 keyUSVString 对象。

语法

// 返回值:返回一个迭代器( iterator)
formData.keys();

示例

// 先创建一个 FormData 对象
var formData = new FormData();formData.append('key1', 'value1');
formData.append('key2', 'value2');// 输出所有的 key
for (var key of formData.keys()) {console.log(key);
}// key1
// key2
  • FormData.values()

FormData.values() 方法返回一个允许遍历该对象中所有值的 迭代器 。这些值是 USVString 或是 Blob 对象。

语法

// 返回值:返回一个迭代器
formData.values();

示例

// 创建一个对象
var formData = new FormData();formData.append('key1', 'value1');
formData.append('key2', 'value2');// 显示值
for (var value of formData.values()) {console.log(value);
}// value1

总结

本章节主要是对 FormData 用法进行简单的整理和收录,如若有问题,请及时反馈。

相关文章:

前端 | FormData 用法详解

前端 | FormData 用法详解 介绍 ​FormData 是 Ajax2.0 对象用以将数据编译成键值对&#xff0c;以便于 XMLHttpRequest 来发送数据。XMLHttpRequest Level 2 提供的一个接口对象&#xff0c;可以使用该对象来模拟和处理表单并方便的进行文件上传操作 ​ 如果表单属性设为 mu…...

linux常见命令-文件目录类

9.4 文件目录类 &#xff08;1&#xff09;pwd 指令:显示当前工作目录的绝对路径 &#xff08;2&#xff09;Is指令:查看当前目录的所有内容信息 基本语法&#xff1a; ls [选项,可选多个] [目录或是文件] 常用选项:-a:显示当前目录所有的文件和目录&#xff0c;包括隐藏的…...

2023 10月8日 至 10 月16日学习总结

1.做的题目 [RootersCTF2019]I_&#xff1c;3_Flask_双层小牛堡的博客-CSDN博客 [NCTF2019]SQLi regexp 盲注-CSDN博客 [网鼎杯 2018]Comment git泄露 / 恢复 二次注入 .DS_Store bash_history文件查看-CSDN博客 PHP LFI 利用临时文件Getshell_双层小牛堡的博客-CSDN博客 …...

【Java 进阶篇】深入了解 Bootstrap 表格和菜单

表格和菜单是网页设计中的重要组成部分&#xff0c;它们用于展示数据、导航和用户交互。Bootstrap 是一个强大的前端框架&#xff0c;提供了丰富的表格样式和菜单组件&#xff0c;使开发者能够轻松创建功能丰富的网页。在本文中&#xff0c;我们将深入探讨 Bootstrap 中表格和菜…...

java的for循环中遇到异常抛出后继续循环执行

java的for循环中遇到异常抛出后继续循环执行 Test public void loopTryCatchTest() throws Exception {Map<String, Object> a new HashMap();a.put("a", "1");a.put("b", null);a.put("c", "3");for (Map.Entry<…...

【Javascript】构造函数之new的作用

目录 new的作用 把对象返回了回来 无new 有new 把构造函数的this指向了要返回的对象 无new​编辑 有new new的执行流程 new的作用 创建了新空对象将构造函数的作用域赋值给新对象(this指向新对象)执行构造函数代码 &#xff08;为这个新对象添加属性&#xff09;返回新对…...

粘包和半包问题及解决办法

粘包问题是指数据在传输时&#xff0c;在一条消息中读取到了另一条消息的部分数据&#xff0c;这种现象就叫做粘包。 半包问题是指数据在传输时&#xff0c;接收端只收到了部分数据&#xff0c;而非完整的数据&#xff0c;就叫做半包。 产生粘包和半包问题原因&#xff1a; …...

MySQL数据库查询实战操作

前置条件: 创建库:MySQL基本操作之创建数据库-CSDN博客 创建表:MySQL基本操作之创建数据表-CSDN博客 目录 常规查询常用函数union查询一、常规查询 1、查询所有姓名以 "张" 开头的学生: SELECT * FROM student WHERE name LIKE 张%; 这条语句使用 LIKE 运算…...

Elasticsearch 8.9 Master节点处理请求源码

大家看可以看ElasticSearch源码&#xff1a;Rest请求与Master节点处理流程&#xff08;1&#xff09; 这个图非常好&#xff0c;下午的讲解代码在各个类和方法之间流转&#xff0c;都体现这个图上 一、Master节点处理请求的逻辑1、节点(数据节点)要和主节点进行通讯&#xff0…...

Python---练习:while循环案例:猜数字

需求&#xff1a; 计算机从1 ~ 10之间随机生成一个数字&#xff0c;然后提示输入数字&#xff0c;如果我们输入的数字与随机数相等&#xff0c;则提示恭喜你&#xff0c;答对了。如果输入的数字比随机数大&#xff0c;则提示&#xff0c;猜大了。反之&#xff0c;则提示猜小了…...

CRM自动化意味着什么?企业如何从中受益?

客户关系管理&#xff08;CRM&#xff09;软件不再仅仅适用于大公司或销售周期长的行业&#xff0c;它越来越成为各种规模企业的重要工具。 在日常工作中&#xff0c;当你陷入流程的所有细节时&#xff0c;可能会产生不必要的工作。因此&#xff0c;如果你想要CRM提供的组织和…...

Python大数据之PySpark

PySpark入门 1、 Spark与PySpark 1、 Spark与PySpark...

网工记背命令(7)----静态路由(负载分担,主备备份)

1.静态路由负载分担 如图所示&#xff0c;属于不同网段的主机通过几台 Switch 相连&#xff0c;要求不配置动态路由协议&#xff0c;使不同网 段的任意两台主机之间能够互通&#xff0c;从拓扑图中可以看出&#xff0c;从 PCA 到 PCC 有两条路径可以过去&#xff0c;分别是 PC…...

error: unable to read askpass response from

报错信息 解决方法&#xff1a; 中文&#xff1a;文件-->设置-->版本控制-->Git-->勾选使用凭证帮助程序 英文&#xff1a;File -> Settings -> Version Control -> Git / Check "User credential Helper" 因为我的webstrom是中文版的&#…...

运行stable-diffusion-xl-refiner-1.0遇到version `GLIBCXX_3.4.29‘ not found的问题

一、问题背景 https://huggingface.co/stabilityai/stable-diffusion-xl-refiner-1.0 在运行示例程序时候遇到GLIBCXX_3.4.29‘ not found diffusers to > 0.18.0 import torch from diffusers import StableDiffusionXLImg2ImgPipeline from diffusers.utils import loa…...

Ubuntu - 安装 Elasticsearch(ES)

注意&#xff1a;以下步骤基于 Elasticsearch 7.x 版本。版本可能会随时间而变化&#xff0c;请查看 Elasticsearch 官方网站以获取最新的版本信息。 添加 Elasticsearch APT 仓库&#xff1a; 打开终端&#xff0c;并使用以下命令添加 Elasticsearch APT 仓库到系统&#xf…...

字节码进阶之java Instrumentation原理详解

文章目录 0. 前言1. 基础2. Java Instrumentation API使用示例 3. Java Agent4. 字节码操作库5. 实际应用6. 注意事项和最佳实践 0. 前言 Java Instrumentation是Java API的一部分&#xff0c;它允许开发人员在运行时修改类的字节码。使用此功能&#xff0c;可以实现许多高级操…...

Android 13.0 锁屏页面禁止下拉状态栏

1.概述 在13.0的系统产品定制化中,在默认的锁屏界面的时候原生系统是可以下拉状态栏的,但是定制的产品是需要禁用下拉状态栏的,所以需要在锁屏页面的时候禁用下拉状态栏,需要从两部分查看下拉状态栏流程然后禁用状态栏 接下来就来分析下看这个功能怎么实现 2.锁屏页面禁止…...

Windows10 Docker 安装教程

Docker Desktop是什么&#xff1f; Docker Desktop是适用于Windows的Docker桌面&#xff0c;是Docker设计用于在Windows 10上运行。它是一个本地 Windows 应用程序&#xff0c;为构建、交付和运行dockerized应用程序提供易于使用的开发环境。Docker Desktop for Windows 使用 …...

JWT认证

目录 前言 JWT组成部分 JWT工作原理 在Express中使用JWT 安装JWT相关的包 导入JWT相关的包 定义密钥 登录成功后调用jwt.sign()生成JWT字符串 将JWT字符串还原为JSON对象 捕获解析JWT失败后产生的错误 结尾 前言 Session 认证机制需要配合 Cookie 才能实现。由于 Co…...

[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解

突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 ​安全措施依赖问题​ GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢

随着互联网技术的飞速发展&#xff0c;消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁&#xff0c;不仅优化了客户体验&#xff0c;还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用&#xff0c;并…...

cf2117E

原题链接&#xff1a;https://codeforces.com/contest/2117/problem/E 题目背景&#xff1a; 给定两个数组a,b&#xff0c;可以执行多次以下操作&#xff1a;选择 i (1 < i < n - 1)&#xff0c;并设置 或&#xff0c;也可以在执行上述操作前执行一次删除任意 和 。求…...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析&#xff08;97/126&#xff09;&#xff1a;邮件营销与用户参与度的关键指标优化指南 在数字化营销时代&#xff0c;邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天&#xff0c;我们将深入解析邮件打开率、网站可用性、页面参与时…...

Java多线程实现之Thread类深度解析

Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

AI病理诊断七剑下天山,医疗未来触手可及

一、病理诊断困局&#xff1a;刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断"&#xff0c;医生需通过显微镜观察组织切片&#xff0c;在细胞迷宫中捕捉癌变信号。某省病理质控报告显示&#xff0c;基层医院误诊率达12%-15%&#xff0c;专家会诊…...

LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》

这段 Python 代码是一个完整的 知识库数据库操作模块&#xff0c;用于对本地知识库系统中的知识库进行增删改查&#xff08;CRUD&#xff09;操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 &#x1f4d8; 一、整体功能概述 该模块…...

【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)

前言&#xff1a; 双亲委派机制对于面试这块来说非常重要&#xff0c;在实际开发中也是经常遇见需要打破双亲委派的需求&#xff0c;今天我们一起来探索一下什么是双亲委派机制&#xff0c;在此之前我们先介绍一下类的加载器。 目录 ​编辑 前言&#xff1a; 类加载器 1. …...

libfmt: 现代C++的格式化工具库介绍与酷炫功能

libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库&#xff0c;提供了高效、安全的文本格式化功能&#xff0c;是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全&#xff1a…...

uniapp 实现腾讯云IM群文件上传下载功能

UniApp 集成腾讯云IM实现群文件上传下载功能全攻略 一、功能背景与技术选型 在团队协作场景中&#xff0c;群文件共享是核心需求之一。本文将介绍如何基于腾讯云IMCOS&#xff0c;在uniapp中实现&#xff1a; 群内文件上传/下载文件元数据管理下载进度追踪跨平台文件预览 二…...