首页 web前端 H5教程 HTML5 FormData用法详解以及文件上传实现过程讲解

HTML5 FormData用法详解以及文件上传实现过程讲解

Sep 13, 2017 am 10:10 AM
formdata h5 html5

本篇文章主要介绍了HTML5 FormData 方法介绍以及实现文件上传示例,具有一定的参考价值,有兴趣的可以了解一下

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

FormData 上传文件实例

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


1

2

var form = document.getElementById("form1");

var fd = new FormData(form);

登录后复制

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

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


1

2

3

4

5

6

7

8

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

<p id="result"></p>

登录后复制

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

这里写图片描述

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


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

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 = &#39;&#39;;

                result +="个人信息:<br/>name:"+json[&#39;name&#39;]+"<br/>gender:"+json[&#39;gender&#39;]+"<br/>number:"+json[&#39;number&#39;];

                 result += &#39;<br/>头像:<img src="&#39; + json[&#39;photo&#39;] + &#39;" height="100" style="border-radius: 50%;" />&#39;;

                 $(&#39;#result&#39;).html(result);

             }

        });

        return false;

    }

登录后复制

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


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

<?php

 

$name = isset($_POST[&#39;name&#39;])? $_POST[&#39;name&#39;] : &#39;&#39;; 

$gender = isset($_POST[&#39;gender&#39;])? $_POST[&#39;gender&#39;] : &#39;&#39;;

$number = isset($_POST[&#39;number&#39;])? $_POST[&#39;number&#39;] : &#39;&#39;; 

$filename = time().substr($_FILES[&#39;photo&#39;][&#39;name&#39;], strrpos($_FILES[&#39;photo&#39;][&#39;name&#39;],&#39;.&#39;)); 

$response = array();

 

if(move_uploaded_file($_FILES[&#39;photo&#39;][&#39;tmp_name&#39;], $filename)){ 

    $response[&#39;isSuccess&#39;] = true; 

    $response[&#39;name&#39;] = $name

    $response[&#39;gender&#39;] = $gender;

    $response[&#39;number&#39;] = $number

    $response[&#39;photo&#39;] = $filename

}else

    $response[&#39;isSuccess&#39;] = false; 

echo json_encode($response);

 

?>

登录后复制

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

这里写图片描述

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


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

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 = &#39;&#39;;

            result +="个人信息:<br/>name:"+json[&#39;name&#39;]+"<br/>gender:"+json[&#39;gender&#39;]+"<br/>number:"+json[&#39;number&#39;];

             result += &#39;<br/>头像:<img src="&#39; + json[&#39;photo&#39;] + &#39;" height="50" style="border-radius: 50%;" />&#39;;

 

             $(&#39;#result&#39;).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 对象中添加键值对:


1

2

fd.append(&#39;key1&#39;,"value1");

fd.append(&#39;key2&#39;,"value2");

登录后复制

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

2、set()

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


1

2

fd.set(&#39;key1&#39;,"value1");

fd.set(&#39;key2&#39;,"value2");

登录后复制

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


1

fd.append(&#39;name&#39;,"will");

登录后复制

有两个key为name的键值对:

这里写图片描述


1

fd.set(&#39;name&#39;,"will");

登录后复制

只有一个key为name的键值对:

这里写图片描述

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

3、delete()

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


1

2

fd.append(&#39;name&#39;,&#39;will&#39;);

fd.delete(&#39;name&#39;);

登录后复制

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

4、get() 和 getAll()

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

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


1

2

fd.append(&#39;name&#39;,&#39;will&#39;);

console.log(fd.get(&#39;name&#39;)); // sean

登录后复制


1

2

fd.append(&#39;name&#39;,&#39;will&#39;);

console.log(fd.getAll(&#39;name&#39;)); // ["sean", "will"]

登录后复制

5、has()

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


1

2

console.log(fd.has(&#39;name&#39;)); // true

console.log(fd.has(&#39;Name&#39;)); // false

登录后复制

6、keys()

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


1

2

3

for (var key of fd.keys()) {

           console.log(key);

        }

登录后复制

结果为:

name
gender
number
photo

7、values()

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


1

2

3

for (var value of fd.values()) {

           console.log(value);

        }

登录后复制

结果:

这里写图片描述

8、entries()

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


1

2

3

for(var pair of fd.entries()) {

           console.log(pair[0]+ &#39;, &#39;+ pair[1]);

        }

登录后复制

结果:

这里写图片描述

FormData兼容性问题

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

这里写图片描述

以上是HTML5 FormData用法详解以及文件上传实现过程讲解的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Java教程
1677
14
CakePHP 教程
1431
52
Laravel 教程
1334
25
PHP教程
1280
29
C# 教程
1257
24
HTML 中的表格边框 HTML 中的表格边框 Sep 04, 2024 pm 04:49 PM

HTML 表格边框指南。在这里,我们以 HTML 中的表格边框为例,讨论定义表格边框的多种方法。

HTML 中的嵌套表 HTML 中的嵌套表 Sep 04, 2024 pm 04:49 PM

这是 HTML 中嵌套表的指南。这里我们讨论如何在表中创建表以及相应的示例。

HTML 左边距 HTML 左边距 Sep 04, 2024 pm 04:48 PM

HTML 左边距指南。在这里,我们讨论 HTML margin-left 的简要概述及其示例及其代码实现。

HTML 表格布局 HTML 表格布局 Sep 04, 2024 pm 04:54 PM

HTML 表格布局指南。在这里,我们详细讨论 HTML 表格布局的值以及示例和输出。

HTML 输入占位符 HTML 输入占位符 Sep 04, 2024 pm 04:54 PM

HTML 输入占位符指南。在这里,我们讨论 HTML 输入占位符的示例以及代码和输出。

HTML 有序列表 HTML 有序列表 Sep 04, 2024 pm 04:43 PM

HTML 有序列表指南。在这里我们还分别讨论了 HTML 有序列表和类型的介绍以及它们的示例

HTML onclick 按钮 HTML onclick 按钮 Sep 04, 2024 pm 04:49 PM

HTML onclick 按钮指南。这里我们分别讨论它们的介绍、工作原理、示例以及各个事件中的onclick事件。

在 HTML 中移动文本 在 HTML 中移动文本 Sep 04, 2024 pm 04:45 PM

HTML 中的文本移动指南。在这里我们讨论一下marquee标签如何使用语法和实现示例。

See all articles