FormData详解

FormData详解FormData 接口提供了一种表示表单数据的键值对 key value 的构造方式 并且可以轻松的将数据通过 XMLHttpReque send 方法发送出去 本接口和此方法都相当简单直接 如果表单 enctype 属性设为 multipart form data 则会使用表单的 submit 方法来发送数据 从而发送数据具有同样形式 构造函数 FormData 构造函数用于创建一个新的 FormData 对象 varformData newFormData form

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对象:

 
  

注意: 所有的输入元素都需要有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详解

使用 FormData 对象发送文件

 
   
  

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

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/208885.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 上午10:33
下一篇 2026年3月19日 上午10:33


相关推荐

  • HTML/CSS 常见面试题汇总

    HTML/CSS 常见面试题汇总HTML面试题1、<image>标签上title属性与alt属性的区别是什么?alt属性是为了给那些不能看到你文档中图像的浏览者提供文字说明的。且长度必须少于100个英文字符或者用户必须保证替换文字尽可能的短。这包括那些使用本来就不支持图像显示或者图像显示被关闭的浏览器的用户,视觉障碍的用户和使用屏幕阅读器的用户等。title属性为设置该属性的元素提供建议性的信息。使用ti…

    2022年5月31日
    34
  • 堆栈溢出排查

    堆栈溢出排查ps-ef|greprimsjmap-histo:live28972|head-7启动程序时配置内存溢出时自动导出dump文件-XX:+HeapDumpOnOutOfMemoryError-XX:HeapDumpPath=/home/d5000/eas/easDmSync/heapdump.hprof

    2025年6月13日
    3
  • mac 打开pycharm 特别慢的问题

    mac 打开pycharm 特别慢的问题mac 在安装好 pycharm 之后 发现打开的时候特别慢 我觉得我刚买的电脑不应该出现这种问题才对啊 难道这苹果就这么拉垮 后来问下度娘发现还是设置的问题 1 首先打开访达 找到 pycharm 的图标 2 右键选择新建位于文件夹为止的终端窗口 3 进入该目录 4 执行 vibin pycharm vmoptions 会发现前两行 xms 特别小 应该是 128m 把这个大小修改一下 就 OK 了

    2026年3月17日
    2
  • windows下安装mysql

    windows下安装mysql

    2021年11月27日
    93
  • hi3798mv300是什么手机_华为海思电视芯片hi3798mv300 硬件参数如何?

    hi3798mv300是什么手机_华为海思电视芯片hi3798mv300 硬件参数如何?这个是MV300的参数http://www.hisilicon.com.cn/-/media/Hisilicon/pdf/STB/Hi3798MV300.pdf​www.hisilicon.com.cn这个是MV200的参数http://www.hisilicon.com/-/media/Hisilicon/pdf/STB/Hi3798MV200.pdf​www.hisilicon.com两者对比…

    2022年6月22日
    146
  • 网站管理后台帐号密码暴力激活成功教程方法

    网站管理后台帐号密码暴力激活成功教程方法【导读】对于网站运行的个人站长而言,最担心的是应如何有效且安全的去管理自己的网站,否则自己辛辛苦苦经营的网站就会被不请自来的不速之客给攻破,轻则站点数据被窃取,重则整个网站都被攻陷,导致无法恢复。本文主要从管理后台这个方面来讲解其黑客攻击过程,并通过在虚拟环境中展开实例演示,各读者可以跟着本教程去做实验,通过实验加强对攻击过程的了解,如果你是一名菜鸟站长也可以针对性的去做一下防护方案。…

    2022年10月13日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号