HTML5 FormData 方法介绍以及实现文件上传

2023-11-02

XMLHttpRequest 是一个浏览器接口,通过它,我们可以使得 Javascript 进行 HTTP (S) 通信。XMLHttpRequest 在现在浏览器中是一种常用的前后台交互数据的方式。2008年 2 月,XMLHttpRequest Level 2 草案提出来了,相对于上一代,它有一些新的特性,其中 FormData 就是 XMLHttpRequest Level 2 新增的一个对象,利用它来提交表单、模拟表单提交,当然最大的优势就是可以上传二进制文件。下面就具体介绍一下如何利用 FormData 来上传文件。

FormData 上传文件实例

首先看一下formData的基本用法:FormData对象,可以把所有表单元素的name与value组成一个queryString,提交到后台。只需要把 form 表单作为参数传入 FormData 构造函数即可:

var form = document.getElementById("form1");
var fd = new FormData(form);

这样就可以直接通过ajax 的 send() 方法将 fd 发送到后台。

以下创建了一个表单 form,表单中除了普通的数据外,还有文件上传,我们直接将 form对象作为参数传入FormData对象:

<form name="form1" id="form1">  
        <p>name:<input type="text" name="name" /></p>  
        <p>gender:<input type="radio" name="gender" value="1" />male <input type="radio" name="gender" value="2" />female</p>
        <p>stu-number:<input type="text" name="number" /></p>  
        <p>photo:<input type="file" name="photo" id="photo"></p>  
        <p><input type="button" name="b1" value="submit" onclick="fsubmit()" /></p>  
</form>  
<div id="result"></div>

上述代码创建一个form,简单的填写一些信息,以及选择一张图片作为头像,设置一个div来存放返回的结果。

这里写图片描述

为了简便,我们还是采用jquery封装的ajax来向后台传输数据:

function fsubmit() {
        var form=document.getElementById("form1");
        var fd =new FormData(form);
        $.ajax({
             url: "server.php",
             type: "POST",
             data: fd,
             processData: false,  // 告诉jQuery不要去处理发送的数据
             contentType: false,   // 告诉jQuery不要去设置Content-Type请求头
             success: function(response,status,xhr){
                console.log(xhr);
                var json=$.parseJSON(response);
                var result = '';
                result +="个人信息:<br/>name:"+json['name']+"<br/>gender:"+json['gender']+"<br/>number:"+json['number'];
                 result += '<br/>头像:<img src="' + json['photo'] + '" height="100" style="border-radius: 50%;" />';
                 $('#result').html(result);
             }
        });
        return false;
    }

上述代码中的 server.php 是服务器端的文件,接收ajax请求,并将接收结果返回,具体代码如下:

<?php

$name = isset($_POST['name'])? $_POST['name'] : '';  
$gender = isset($_POST['gender'])? $_POST['gender'] : '';
$number = isset($_POST['number'])? $_POST['number'] : '';  
$filename = time().substr($_FILES['photo']['name'], strrpos($_FILES['photo']['name'],'.'));  
$response = array();

if(move_uploaded_file($_FILES['photo']['tmp_name'], $filename)){  
    $response['isSuccess'] = true;  
    $response['name'] = $name;  
    $response['gender'] = $gender;
    $response['number'] = $number;  
    $response['photo'] = $filename;  
}else{  
    $response['isSuccess'] = false;  
}  
echo json_encode($response);

?>

填写好信息后,点击 submit,页面中能得到以下效果,去服务器端对应的文件夹下也能发现上传的图片。

这里写图片描述

如果你是原生 JavaScript 爱好者,当然一样能实现以上功能,下面是简单的JavaScript实现代码:

function fsubmit() {
    var form=document.getElementById("form1");
    var formData=new FormData(form);
    alert(formData.name);
    var oReq = new XMLHttpRequest();
    oReq.onreadystatechange=function(){
      if(oReq.readyState==4){
        if(oReq.status==200){
            console.log(typeof oReq.responseText);
            var json=JSON.parse(oReq.responseText);
            var result = '';
            result +="个人信息:<br/>name:"+json['name']+"<br/>gender:"+json['gender']+"<br/>number:"+json['number'];
             result += '<br/>头像:<img src="' + json['photo'] + '" height="50" style="border-radius: 50%;" />';

             $('#result').html(result);
        }
      }
    };
    oReq.open("POST", "server.php");
    oReq.send(formData); 
    return false;
}

FormData 对象方法介绍

FormData 除了上面的创建新对象时直接将 form 作为参数传入外,还有其他的功能。网上大部分关于 FormData 介绍的文章都只提到了append()方法,那么FormData 对象到底有些什么方法呢?我们console 一下就知道:

这里写图片描述

console 之后我们有重大的发现,FormData 对象竟然有这么方法,所以还是自己测试才能发现真相,下面就对这些方法一一进行讲解:

1、append()

append()方法用于向 FormData 对象中添加键值对:

fd.append('key1',"value1");
fd.append('key2',"value2");

fd是 FormData 对象,可以新建的空的对象,也可以是已经包含 form 表单或其他键值对。

2、set()

设置对应的键 key 对应的值 value(s)

fd.set('key1',"value1");
fd.set('key2',"value2");

看起来跟append() 方法有点类似,这两者的区别就是,当指定的 key 值存在时,append()方法是将新增的添加的所以的键值对最后,而set()方法将会覆盖前面的设置的键值对。还是通过实例来对比,我们在前面的 form 的基础上 append() 或 set() 新的键值对:

fd.append('name',"will");

有两个key为name的键值对:
这里写图片描述

fd.set('name',"will");

只有一个key为name的键值对:
这里写图片描述

以上就是 append() 和 set() 的区别。如果设置的key值不存在,那么两者的效果是一样的。

3、delete()

接收一个参数,表示你要删除的 key 值的名字,如果有多个相同 key 值,会一并删除:

fd.append('name','will');
fd.delete('name');

form 中的 name 信息以及通过append() 新增的name 的信息都被删除了。

4、get() 和 getAll()

接收一个参数,表示需要查找的 key 的名称,返回第一个该 key 对应的 value 值。如果有多个相同的 key, 而且要返回所有的这个 key 对应的 value 值。

同样以上面的 form 表单为基础:

fd.append('name','will');
console.log(fd.get('name')); // sean
fd.append('name','will');
console.log(fd.getAll('name')); // ["sean", "will"]

5、has()

该方法也接收一个参数,同样是 key 的名称,返回一个Boolean 值, 用来判断FormData 对象是否含有该 key。以上面的form为例:

console.log(fd.has('name')); // true
console.log(fd.has('Name')); // false

6、keys()

该方法不需要接收参数,返回一个迭代器,通过这个迭代器,我们可以遍历FormData 对象中所有的 key。以上面的form为例:

for (var key of fd.keys()) {
           console.log(key); 
        }

结果为:

name
gender
number
photo

7、values()

有遍历 key 的迭代,当然也就少不了遍历 value 的迭代器了。values()就是遍历value 的迭代器,用法与 keys() 类似:

for (var value of fd.values()) {
           console.log(value); 
        }

结果:

这里写图片描述

8、entries()

有遍历 key 的迭代器,也有遍历 value 的迭代器,为何不搞一个两者一起的呢!entries()就是返回一个包含键值对的迭代器:

for(var pair of fd.entries()) {
           console.log(pair[0]+ ', '+ pair[1]); 
        }

结果:

这里写图片描述

FormData兼容性问题

由于 FormData 是 XMLHttpRequest Level 2 新增的接口,现在 低于IE10 的IE浏览器不支持 FormData ,至于 上面介绍的 FormData 对象的方法经过测试,在 IE 浏览器中都不支持,具体的各大浏览器的支持情况可以参照下图:

这里写图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

HTML5 FormData 方法介绍以及实现文件上传 的相关文章

  • ElementUi常用组件创建前端页面

    elementui 创建前端页面
  • JS有小数保留两位,整数不显示小数

    在很多时候要展示数据 会有各种小数处理 碰到页面的数据要根据不同的情况展示不同格式的数据 比如得到的数据是一个小数 现在要将小数保留两位 而整数则不显示小数点 显示整数格式 使用toFixed n 方法 toFixed 2 里面的2表示保留
  • HTML5游戏实战(2):90行代码实现捕鱼达人

    捕鱼达人是一款非常流行的游戏 几年里赚取了数以千万的收入 这里借用它来介绍一下用Gamebuilder CanTK开发游戏的方法 其实赚钱的游戏未必技术就很难 今天我们就仅用90来行代码来实现这个游戏 CanTK Canvas ToolKi
  • 58同城 -- 前端一面

    面我的是一个小哥哥 面试体验挺好的 大概进行了35分钟左右 自我介绍 面试内容 为什么向做前端 怎么学习的前端 本人非科班哈 然后问我项目 直接问项目 没问笔试令我有点意外 问我印象最深的项目 印象最深的功能 遇到的难点 前端存储的区别 C
  • div标签的contenteditable属性实现input效果以及控制input的聚焦失焦

    在触屏 移动端网页 中 聊天室类型的输入框很常见 但是很多都是自定义样式的 直接改造input标签会很麻烦 给div标签设置contenteditable属性可以达到input标签的效果还能轻松的自定义样式 利用input事件和v text
  • jquery attr()方法 添加,修改,获取对象的属性值

    转自 http hi baidu com 0701u item b8ec62c1daba973eef466524 jquery中用attr 方法来获取和设置元素属性 attr是attribute 属性 的缩写 在jQuery DOM操作中会
  • HTML 5 标签、属性、事件及浏览器兼容性速查表

    HTML 5 可以说是近十年来 Web 标准最巨大的飞跃 和以前的版本不同 HTML 5 并非仅仅用来表示 Web 内容 它的使命是将 Web 带入一个成熟的应用平台 在这个平台上 视频 音频 图象 动画 以及同电脑的交互都被标准化 尽管
  • border-radius使用详解

    我在使用这个属性的时候 一般都是用在给div或者button加上一点圆角弧度 显得好看一点 或者用来画一个圆形div 用的稍微高级一点的 也就是用来画了一个右半圆来做为侧边栏的展开 收缩按钮 一 border radius使用 border
  • HTML头部

    目录 实例 HTML 元素 HTML
  • HTML+CSS3 5个炫酷的loading

    为了方便大家方便CV 每个loading对应一个html文件 文件下载压缩包 下载地址 https download csdn net download m0 48850204 20432352 spm 1001 2014 3001 550
  • WEB交互界面易用性设计和验收的指导性原则

    随着企业intranet和国际internet的迅速发展 越来越多的工作流程 商务交易 教育 培训 会议和讲座 以及个人消费娱乐都被转移到所谓的万维网 World Wide Web 以下简称WEB 上来了 与此相对应的是交互操作的复杂性越来
  • 【H5】 svg画扇形饼图

    H5 svg画扇形饼图 效果图如下 封装代码如下 代码内有详细注解哦
  • elementui 禁止浏览器自动填充用户名密码

    浏览器这功能在登录的时候挺好用的 但是在注册和管理的时候就很难受了 所以 在普通的input上直接off就行了
  • HTML5的多个video标签:截取视频源的封面图poster,监听视频播放状态的功能;

    在日常项目中 html5的video标签还是比较常用到的 开发过程中 我们都会使用到 通过监听video标签的播放 暂停 停止等等来使用 我们是否也会遇到过 有些浏览器在显示这标签 兼容不太友好 video标签的封面是一层黑色的 ok 那么
  • 网页订货系统的诸多优势|企业APP订单管理软件

    1 订单信息 发货信息 账目信息一目了然 生产企业 总代理 和分销商之间可以清楚直观的了解到商品和货款的实时状态 以便高效的订货 发货 进行货款催收以及商品的物流跟踪 2 建立稳固的客户关系 避免客户被竞争对手挖墙脚 有了网上订货系统 企业
  • 通过blueimp jquery-fileupload异步上传多个文件

    我正在使用 jQuery 文件上传库 http github com blueimp jQuery File Upload http github com blueimp jQuery File Upload 并且我一直在思考如何使用满足以
  • 使用 RubyOnRails 上传 HTML5 FormData 文件

    我使用此脚本在 Rails 3 2 8 应用程序中使用 HTML5 FormData 上传文件 逐一 http jsfiddle net RamPr http jsfiddle net RamPr uploader input file o
  • Express JS 路由中使用 formData 获取 POST 为空

    我有一个表单 它使用 fetch 到 AJAX 并在 NodeJS 上有一个路由 当 AJAX POST 命中路由时 req body 显示一个空对象 这是代码 在 app js 中 app use bodyParser json app
  • formData.has() 不是一个函数[重复]

    这个问题在这里已经有答案了 我正在尝试执行简单的 ajax 文件上传 但收到 未捕获的类型错误 formData has 不是函数 如果我还注释掉 formData has 检查函数并将其替换为 formData append myResu
  • 在 AngularJS 中发送 FormData 和其他字段

    我有一个表格有两个input text和一个upload 我必须将其发送到服务器 但在将文件与文本连接时遇到一些问题 服务器期望这个答案 title first input text second input file my file pd

随机推荐

  • go 进阶 协程相关: 五. 协程底层从Main方法到调度器

    目录 三 通过runtime mstart SB 启动调度循环了解调度底层 再简单复习一下m p g的关系与调度过程简介 mstart1 初始化设置 schedule 调度函数 1 globrunqget 通过全局队列获取可运行G 通过全局
  • 在线生日快乐网站,可以在线访问,通过网址!

    在线生日快乐网站 可以在线访问 通过网址 详情可私信 详情可私信 点击查看详情
  • js逆向播放量增加,增加视频热度,uuid,sid,buvid3,aid,b_lsid, b_nut 还原实现过程

    本次记录尝试逆向某比里比里视频平台播放量 主要思路 不断debug 观察代码设计还原实现 1 播放量增加必定是点击播放后的记录 2 清空监视器 点击播放开始debug 截取到的就代表包含了增加播放量的包 3 验证截取到的包 测试看哪一个是包
  • C++学习(四九四)cmake从list从删除文件

    生成文件列表 file GLOB RECURSE lib srcs c 输出文件列表 注意lib srcs的写法 需要 MESSAGE STATUS lib srcs 从文件列表中删除文件 注意lib srcs的写法 不需要 注意文件路径
  • 【pyq文案】合理但有病の自拍文案

    1 丑一眼 2 强子 妈发自拍了 3 真是方向失了南北 美的有点东西 4 妈的看自己就烦 800块出了 完美无瑕 5 拍了拍自己 6 这张脸 全是这双手给的 7 糟糕 没有酷起来 8 制造美女我比女娲还牛 9 注意看 无论从正面还是侧面 这
  • 如何在vscode中显示markdow大纲

    你可以在 Visual Studio Code 中使用 Markdown All in One 扩展来显示 Markdown 大纲 首先 你需要在 Visual Studio Code 中安装 Markdown All in One 扩展
  • 现代操作系统 第七章

    虚拟化和云 虚拟化的主要思想是虚拟化监控程序 virtual Machine Monitor VMM 在同一物理硬件上创建出有多台虚拟机器的假象 VMM又称作虚拟机管理程序 hypervisor 这种方法的好处是一台虚拟机的故障不会影响其他
  • 【IDEA使用教程】利用教育邮箱免费激活Jetbrains系列产品

    如果是学生并且你们学校给你们注册了edu后缀的教育邮箱 那么恭喜你 可以免费激活并使用idea等软件了 1 进入网站JetBrains 学习产品https www jetbrains com shop eform students 2 填写
  • Java IO技术

    Java IO技术 java io包为我们提供了IO相关的API 实现了对所有外部系统的输入输出操作 数据源 数据源data source 提供数据的原始媒介 常见的数据源有 数据库 文件 其他程序 内存 网络连接 IO设备 数据源分为 源
  • MIB基本概念

    MIB的概念 MIB的定义 MIB中的OID OID的表示方式 SMI 对象数据类型 MIB 2中的文本规定 MIB和SMI关系 MIB编写示例 more 一 MIB的概念 MIB全称Management Information Base
  • 【详解如何一步步实现三子棋】

    相信大家都玩过五子棋 三子棋也是一样的道理 行列三子 对角线三子获得胜利 想要实现三子棋小游戏需要哪几步 1 三子棋首先我们要创建棋盘 创建一个二维数组三行三列 然后将棋盘初始化为全空格 2 如何将棋盘转换为网格状棋盘 如下图 3 玩家下棋
  • e-charts 图例过多问题

    饼图的图例 如果过多 需要增加 分页按钮 注意 如果测试用例数量不够 则分页按钮不会出现 会默认将画面填满后 分页按钮才会出现 我之前只用了两三个 总是不出现 气死了 legend top 15 type scroll orient ver
  • nginx代理获取ip为127.0.0.1解决方法

    原因 我们访问互联网上的服务时 大多数时 客户端并不是直接访问到服务端的 而是客户端首先请求到反向代理 反向代理再转发到服务端实现服务访问 通过反向代理实现路由 负载均衡等策略 这样在服务端拿到的客户端IP将是反向代理IP 而不是真实客户端
  • LeetCode:用栈实现队列(纯C语言)可CV

    题目链接 232 用栈实现队列 力扣 Leetcode 还是老套路二话不说 先上代码 typedef char STDataType typedef struct Stack STDataType a int top int capacit
  • Android开发——V1及V2签名原理简析

    Android为了保证系统及应用的安全性 在安装APK的时候需要校验包的完整性 同时 对于覆盖安装的场景还要校验新旧是否匹配 这两者都是通过Android签名机制来进行保证的 本文就简单看下Android的签名与校验原理 分一下几个部分分析
  • 指路明灯,99%自动化测试从业者都该看的职业规划!

    这篇文章将从以下三个方面来给大家介绍自动化测试 其中包含自动化测试从业者需要了解的知识和一些常见的思想误区 以及自动化测试行业的前景以及如何进阶 1 自动化测试的介绍 自动化测试什么是 有哪些被称作自动化测试 自动化测试意义何在 和所有的项
  • React + Ant Design Pro项目实现keep-alive页签

    背景 PC端管理系统 采用 ant design pro 方案 它是阿里的一个管理系统框架 技术栈是react 相比vue react一个先天不足是不支持 keep alive 所以管理系统中的多页签功能难以实现 调研 由于官方不支持 只能
  • Tomcat环境变量Catalina_Home配置

    1 CATALINA HOME是TOMCAT安装路径的别名 目的是为了方便使用TOMCAT 2 计算机 gt 属性 gt 环境变量 新建环境变量 变量名为CATALINA HOME 变量值tomcat的解压目录 我电脑上的为 D apach
  • r语言barplot函数图中加标签_R语言中使用text()函数给绘图添加文字

    R语言中text 函数同abline 函数 lines 函数一样属于低水平函数 即在已有绘图中添加相关图形 text 函数的作用是在给定的x和y坐标的位置添加字符串 text 函数的默认使用格式如下 text x y NULL labels
  • HTML5 FormData 方法介绍以及实现文件上传

    XMLHttpRequest 是一个浏览器接口 通过它 我们可以使得 Javascript 进行 HTTP S 通信 XMLHttpRequest 在现在浏览器中是一种常用的前后台交互数据的方式 2008年 2 月 XMLHttpReque