FormData详解

news2024/11/20 3:23:30

FormData 接口提供了一种表示表单数据的键值对 key/value 的构造方式,并且可以轻松的将数据通过XMLHttpRequest.send() 方法发送出去,本接口和此方法都相当简单直接。如果表单 enctype 属性设为 multipart/form-data ,则会使用表单的 submit() 方法来发送数据,从而发送数据具有同样形式。

构造函数

FormData()构造函数用于创建一个新的FormData对象。

var formData = new FormData(form)

form可选

一个HTML 上的``表单元素——当指定了,这种方式创建的FormData对象会自动将form中的表单值也包含进去,包括文件内容也会被编码之后包含进去。

例子

下面的代码将创建一个空的FormData对象:

var formData = new FormData(); // 当前为空

// 你可以使用FormData.append来添加键/值对到表单里面;
formData.append('username', 'yang');

或者你可以使用可选的form参数来创建一个带预置数据的FormData对象:

<form id="myForm" name="myForm">
  <div>
    <label for="username">Enter name:</label>
    <input type="text" id="username" name="username">
  </div>
  <div>
    <label for="useracc">Enter account number:</label>
    <input type="text" id="useracc" name="useracc">
  </div>
  <div>
    <label for="userfile">Upload file:</label>
    <input type="file" id="userfile" name="userfile">
  </div>
<input type="submit" value="Submit!">
</form>

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

vr formData = new FormData($("#myForm")[0]);
var name = formData.get("username"); // 获取名字
var psw = formData.get("useracc"); // 获取账户
// 当然也可以在此基础上,添加其他数据
formData.append("token","kshdfiwi3rh");

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(); // Currently empty

// 你可以通过 FormData.append 往对象里加入键值对:
formData.append('username', 'Chris');
formData.append('userpic', myFileInput.files[0], 'chris.jpg');

// 跟常规表单数据一样,你可以使用同一个名称添加多个值 。例如 (为了与PHP命名习惯一致在名称中添加了[]):
formData.append('userpic[]', myFileInput1.files[0], 'chris1.jpg');
formData.append('userpic[]', myFileInput2.files[0], 'chris2.jpg');

formData.getAll("userpic[]"); // [myFileInput1.files[0], myFileInput2.files[0]]

这项技术使得多文件上传的处理更加简单,因为所得数据结构更有利于循环。

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', 'Chris');
formData.append('username', 'Bob');

// 获取key为name的第一个值
formData.get('username'); // "Chris"

// 返回一个数组,获取key为name的所有值
formData.getAll("username"); // ["Chris",'Bob']

FormData.delete()

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

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

// 例子
var formData = new FormData(myForm);
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(); // Currently empty
formData.set('username', 'Chris');
formData.set('userpic', myFileInput.files[0], 'chris.jpg');

FormData.has()

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

// 语法
formData.has(name);

// 示例
var formData = new FormData();
formData.has('username'); // false
formData.append('username', 'Chris');
formData.has('username'); // true

FormData.entries()

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

// 语法
formData.entries();

// 示例
// Create a test FormData object
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 ,这些 key 是 USVString 对象。

// 语法
// 返回值:返回一个迭代器( 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();

// 示例
//创建一个FormData测试对象
var formData = new FormData();
formData.append('key1', 'value1');
formData.append('key2', 'value2');

//显示值
for (var value of formData.values()) {
   console.log(value);
}
value1
value2

FormData 实践

FormData 对象的使用:

  1. 用一些键值对来模拟一系列表单控件:把 form 中所有表单元素的 name 与 value 组装成一个 queryString;

  2. 异步上传二进制文件;

FormData 对象的操作方法,全部在原型中本身没任何的属性及方法

使用 FormData 对象发送文件

<!--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>

 原生ajax

//原生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) {
            }
    }
}

使用 jQuery

//绑定提交事件
function upload() {
    //获取form表单元素
    var f = document.getElementById("myForm");
    //使用表单元素来构造FromData
    var myform = new FormData(f);
    $.ajax({
        url: "/Library/test/upload",
        type: "post",
        dataType: "json",
        data: myform,
        cache: false,                      // 不缓存
        processData: false,                // jQuery不要去处理发送的数据
        contentType: false,                // jQuery不要去设置Content-Type请求头
        success: function (data) {
            console.log(data);
        }
    });
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/409017.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue项目控制台报错信息问题记录:Uncaught TypeError: Cannot read properties of null (reading ‘setAttribute‘)

在写vue项目的时候&#xff0c;控制台总是报错如下代码&#xff1a; 1、Uncaught TypeError: Cannot read properties of null (reading ‘setAttribute‘) 主要是因为某些代码书写不规范&#xff0c;导致templete解析不出来&#xff0c;从而报错 解决方案&#xff1a; 检查下…

uniapp 实现生成海报并分享给微信好友和保存到本地相册

记录uniapp 生成二维码海报并保存到本地或者分享给微信好友 – 文章目录记录uniapp 生成二维码海报并保存到本地或者分享给微信好友前言一、引入生成二维码的组件二、点击右侧的分享图标生成海报三&#xff1a;将canvas 图片转化成图片&#xff08;最关键&#xff09;四&#…

el-tree设置利用setCheckedNodes/setCheckedKeys默认勾选节点,以及通过setChecked新增勾选指定节点

实现目标&#xff1a;在生成el-tree时&#xff0c;默认勾选其中某几个选项&#xff1b;或在进行某个选项的选中时&#xff0c;同时勾选上另一个选项。 实现效果&#xff1a; 在生成树结构时&#xff0c;默认勾选其中的两个选项。 在勾选其中一个选项时&#xff0c;另一个选项…

微前端之 qiankun 入门、上手、实战(构建大型 web 应用)

目录 前言 正文 一、介绍 微前端 qiankun 二、快速上手 ​☛主应用 ① 安装 qiankun ② 在主应用中注册微应用 ​☛微应用 ① 导出相应的生命周期钩子 ② 配置微应用的打包工具 三、项目实战 ​☛主应用 ① 安装 qiankun ② 注册微应用并启动 ③ 主应用添加…

ES6--》对象扩展方法

目录 对象扩展 name 属性 属性的遍历 super关键字 Object.is() Object.assign() Object.getOwnPropertyDescriptors() Object.setPrototypeOf() Object.getPrototypeOf() Object.keys()、Object.values、Object.entries()、Object.fromEntries() Object.hasOwn() 对…

如何在 2022 年为 Web 应用程序选择技术堆栈

文章目录什么是技术堆栈&#xff1f;为 Web 开发选择技术堆栈时要考虑的事项选择熟悉的技术跟随趋势考虑项目的细节确保高安全级别记住你的最后期限选择前端技术栈框架编程语言选择后端技术栈编程语言数据库技术堆栈是您应用程序的核心选择最佳的 Web 应用程序堆栈并非易事&…

vue3+ts遇到的小问题

插件volar安装了没有提示。 解决&#xff1a;1. 检查是或否是最新的版本&#xff0c;是的话进入拓展设置&#xff0c;所有的选项都勾选 2. 还是不行就要更新vscoe了。一般的话会在力捕抓到一个错误。跟新就好了 TypeScript intellisense is disabled on template. To enab…

【简陋Web应用2】人脸检测——基于Flask和PaddleHub

文章目录&#x1f6a9; 前言&#x1f33a; 效果演示&#x1f966; 分析与设计&#x1f349; 实现&#x1f36c; 1. 部署人脸检测模型&#x1f36d; 2. 使用Flask构建app2.1 目录结构2.2 forms.py2.3 utils.py2.4 app.py2.5 index.html&#x1f95d; Bug(s)&#x1f6a9; 前言 本…

Vue根据网络文件路径下载文件【自定义属性 v-down】

Vue根据网络文件路径下载文件【v-down】标准使用方式企业级Vue开发集成(全局挂载)1.src目录下创建directive文件夹&#xff08;存在则忽略&#xff09;2.down.js文件3.directive根目录创建index.js文件4.main.js 注册自定义属性全局挂载提到下载文件大家首先肯定会想到 模拟点击…

vue2 使用 cesium 篇 【第一篇】

vue2 使用 cesium 篇 今天好好写一篇哈&#xff0c;之前写的半死不活的。首先说明&#xff1a;这篇博文是我边做边写的&#xff0c;小白也是&#xff0c;实现效果会同时发布截图&#xff0c;如果没有实现也会说明&#xff0c;仅仅作为技术积累&#xff0c;选择性分享&#xff0…

面试官:“ES6中新增的Set方法去重你会吗?”我:“看文章就知道了”

赶快悄悄的努力起来吧,不苒在这里衷心祝愿各位大佬都能顺利通过面试。 面试专栏分享,感觉有用的小伙伴可以点个订阅,不定时更新相关面试题:面试专栏 。 文章目录 Set 的基本使用🍔前言🍏正文1. Set1.1 Set的基本使用1.2 Set 常见的属相和方法1.3 应用场景:使用Set对数…

vue组件通信2 | 父子组件通信v-model

引言&#xff1a;最近项目在vue2 升级vue3 &#xff0c;在这个过程中发现v-model 的变化最大。同时也发现了对于v-model 的不熟悉。 因此&#xff0c;本文从文档、vue2的使用方法、vue2 tsx 的使用方法、vue3的使用方法、使用场景来试图探究一下v-model。 一、文档及vue2中 v-…

vue页面刷新

vue页面刷新 首先我们都知道vue属于单页面应用&#xff0c;默认境况下是不会触发刷新页面操作的&#xff0c;所以这个时候就需要我们通过事件来触发reload()来达到刷新操作 接下来我就为大家介绍三种刷新页面的方法 1. wiindow.location.reload([bForceGet])该方法强迫浏览…

vue中组件的name属性含义与用法

vue中组件的name属性含义与用法 name属性&#xff1a;只有作为组件选项时起作用&#xff0c;用来注册组件名 1、注册组件名 局部注册组件&#xff0c;语法&#xff1a;export default{ components:{"组件名":组件对象}} 其中&#xff0c;"组件名"注册方…

从0搭建Vue3组件库(五): 如何使用Vite打包组件库

本篇文章将介绍如何使用 vite 打包我们的组件库,同时告诉大家如何使用插件让打包后的文件自动生成声明文件(*.d.ts) 打包配置 vite 专门提供了库模式的打包方式,配置其实非常简单,首先全局安装 vite 以及vitejs/plugin-vue pnpm add vite vitejs/plugin-vue -D -w 在 componen…

基于Vue+Nodejs实现宿舍管理系统

​ 作者主页&#xff1a;编程指南针简介&#xff1a;Java领域优质创作者、CSDN博客专家 Java项目、简历模板、学习资料、面试题库、技术互助文末获取源码​ 项目编号&#xff1a;BS-QD-002 主要需求&#xff1a; 学生信息录入、修改、删除、查询宿舍管理评分学生早起率、懒…

js之promise

##### 仅做记录复习使用 #### 数据有点混乱 暂时不要看 promise promise是一个对异步操作进行封装并返回其结果的构造函数. 使代码更加简洁和避免回调地狱。 promise是浏览器引擎自带的&#xff08;但不是所有浏览器都支持promise&#xff09; promise的参数是一个函数且…

全网详细解决Set-Location : 找不到接受实际参数“xxx”的位置形式参数。 所在位置 行:1 字符: 1的错误,并深究该错误的原因。

文章目录1. 复现错误2. 分析错误3. 解决问题4. 文末总结1. 复现错误 今天使用PowerShell从C:\Users\baoya>目录切换到C:\Program Files\MySQL\MySQL Server 5.7\bin时&#xff0c;却报出如下图的错误&#xff1a; 即找不到接受实际参数“Files\MySQL\MySQL”的位置形式参数。…

vue最易理解且详细的调用swiper插件

我们最开始接触的是在操作dom时候的时候引入swiper,那么这次我就用之前的文档来教你在vue中如何调用swiper. 我们之前看的是swiper教程 那么我根据上面的教程一步一步来教你使用 1.首先创建好swiper组件.写好template 里面的标签内容(当然这里写了个插槽为了以后方便动态插入…

【跨域】一篇文章彻底解决跨域设置cookie问题!

一篇文章彻底解决跨域设置cookie问题&#xff01; 大家好我是雪人~~⛄ 之前做项目的时候发现后端传过来的 SetCookie 不能正常在浏览器中使用。 是因为谷歌浏览器新版本Chrome 80将Cookie的SameSite属性默认值由None变为Lax。 接下来带大家解决该问题。 原理讲解 我们可以看到…