php 下 html5 XHR2 + FormData + File API 上传文件操作实例分析


Posted in PHP onFebruary 28, 2020

本文实例讲述了php 下 html5 XHR2 + FormData + File API 上传文件操作。分享给大家供大家参考,具体如下:

FormData的作用:

FormData对象可以帮助我们自动的打包表单数据,通过XMLHttpRequest的send()方法来提交表单。当然FormData也可以动态的append数据。FormData的最大优点就是我们可以异步上传一个二进制文件。

例1如下:

<!DOCTYPE HTML>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
  <title></title>
</head>
<body>
  <form method="post" id="myForm" onsubmit="return post();">
    用户名<input type="text" name="uname" />
    密码<input type="password" name="upwd" />
    邮箱<input type="text" name="uemail" />
    <input type="submit" name="submit" value="提交" />
  </form>
</body>
<script type="text/javascript">
function post() {
  var myForm = document.getElementById("myForm");
  //FormData既可以从表单读取数据,也可以动态append(键,值)添加
  var fd = new FormData(myForm);

  var xhr = new XMLHttpRequest();
  xhr.onreadystatechange = function () {
    if (xhr.readyState == 4) {
      alert(this.responseText);
    }
  };
  xhr.open("post", "post.php", true);
  xhr.send(fd);
  return false;
}
</script>
</html>

File API

使用HTML5 DOM新增的File API,现在可以让网页要求用户选择本地文件,并且读取这些文件的信息了。

通过File API,我们可以在用户选取一个或者多个文件之后,访问到代表了所选文件的一个或多个File对象,这些对象被包含在一个FileList对象中。

<!DOCTYPE HTML>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
  <title></title>
</head>
<body>
  <form method="post" id="myForm">
    <input type="file" name="file" id="upfile" />
    <input type="submit" name="submit" value="提交" />
  </form>
</body>
<script type="text/javascript">
  var upfile = document.getElementById("upfile");
  upfile.onchange = function() {
    var file = this.files[0];
    alert("文件名:" + file.name + "\r\n" + "大小:" + file.size + "\r\n");
  };
</script>
</html>

我们通过FormData + File API 上传文件

<!DOCTYPE HTML>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
  <title></title>
</head>
<body>
  <form method="post" id="myForm">
    <input type="file" name="file" id="upfile" />
    <input type="submit" name="submit" value="提交" />
  </form>
</body>
<script type="text/javascript">
  var myForm = document.getElementById("myForm");
  var upfile = document.getElementById("upfile");

  myForm.onsubmit = function() {
    //我们创建一个FormData对象
    var fd = new FormData();
    var file = upfile.files[0];
    //把文件添加到FormData对象中
    fd.append("file", file);

    var xhr = new XMLHttpRequest();
    xhr.onreadystatechange = function () {
      if (xhr.readyState == 4) {
        alert(this.responseText);
      }
    };
    xhr.open("post", "upfile.php", true);
    //发送FormData对象
    xhr.send(fd);
    return false;
  };
</script>
</html>

upfile.php代码如下:

<?php
$uploadDir = './upload/';
if(!file_exists($uploadDir)) {
  @mkdir($uploadDir, 0777, true);
}
$uploadFile = $uploadDir . basename($_FILES['file']['name']);
if(move_uploaded_file($_FILES['file']['tmp_name'], $uploadFile)) {
  echo "OK";
} else {
  echo "NO";
}

使用对象URL来显示你所选择的图片

通过window.URL.createObjectURL()和 window.URL.revokeObjectURL()两个DOM方法。

这两个方法创建简单的URL字符串对象,用于指向任何 DOM File 对象数据,包括用户电脑中的本地文件。

<!DOCTYPE HTML>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
  <title></title>
</head>
<body>
  <form method="post" id="myForm">
    <input type="file" name="file" id="upfile" />
    <input type="submit" name="submit" value="提交" />
  </form>
</body>
<script type="text/javascript">
  var myForm = document.getElementById("myForm");
  var upfile = document.getElementById("upfile");

  upfile.onchange = function() {
    //创建一个img标签
    var img = document.createElement("img");
    //通过file对象创建对象URL
    img.src = window.URL.createObjectURL(this.files[0]);
    img.height = 60;
    img.onload = function() {
      //释放对象URL
      window.URL.revokeObjectURL(this.src);
    };
    document.body.appendChild(img);
  };

  myForm.onsubmit = function() {
    //我们创建一个FormData对象
    var fd = new FormData();
    var file = upfile.files[0];
    //把文件添加到FormData对象中
    fd.append("file", file);

    var xhr = new XMLHttpRequest();
    xhr.onreadystatechange = function () {
      if (xhr.readyState == 4) {
        alert(this.responseText);
      }
    };
    xhr.open("post", "upfile.php", true);
    //发送FormData对象
    xhr.send(fd);
    return false;
  };
</script>
</html>

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
第1次亲密接触PHP5(2)
Oct 09 PHP
PHP 存取 MySQL 数据库的一个例子
Oct 09 PHP
PHP 反射机制实现动态代理的代码
Oct 22 PHP
封装一个PDO数据库操作类代码
Sep 09 PHP
php程序的国际化实现方法(利用gettext)
Aug 14 PHP
支持中文的php加密解密类代码
Nov 27 PHP
通过PHP修改Linux或Unix口令的方法分享
Jan 30 PHP
优化PHP程序的方法小结
Feb 23 PHP
什么是PEAR?什么是PECL?PHP中两个容易混淆的概念解释
Jul 01 PHP
PHP执行SQL文件并将SQL文件导入到数据库
Sep 17 PHP
PHP获取访问页面HTTP状态码的实现代码
Nov 03 PHP
PHP封装的分页类与简单用法示例
Feb 25 PHP
php的无刷新操作实现方法分析
Feb 28 #PHP
php下的原生ajax请求用法实例分析
Feb 28 #PHP
php5.3/5.4/5.5/5.6/7常见新增特性汇总整理
Feb 27 #PHP
php使用fputcsv实现大数据的导出操作详解
Feb 27 #PHP
gearman中任务的优先级和返回状态实例分析
Feb 27 #PHP
gearman中worker常驻后台,导致MySQL server has gone away的解决方法
Feb 27 #PHP
PHP使用gearman进行异步的邮件或短信发送操作详解
Feb 27 #PHP
You might like
如何实现php图片等比例缩放
2015/07/28 PHP
一个简单的php MVC留言本实例代码(必看篇)
2016/09/22 PHP
jQuery源码中的chunker 正则过滤符分析
2012/07/31 Javascript
js如何获取object类型里的键值
2014/02/18 Javascript
javascript动态修改Li节点值的方法
2015/01/20 Javascript
jQuery+PHP实现动态数字展示特效
2015/03/14 Javascript
javascript实现框架高度随内容改变的方法
2015/07/23 Javascript
Javascript 事件冒泡机制详细介绍
2016/10/10 Javascript
js实现随机点名小功能
2017/08/17 Javascript
浅谈Node.js爬虫之网页请求模块
2018/01/11 Javascript
Bootstrap table表格初始化表格数据的方法
2018/07/25 Javascript
微信小程序身份证验证方法实现详解
2019/06/28 Javascript
vue滚动tab跟随切换效果
2020/06/29 Javascript
微信小程序 行的删除和增加操作实现详解
2019/09/29 Javascript
微信小程序 下拉刷新及上拉加载原理解析
2019/11/06 Javascript
[44:33]EG vs Liquid 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
Python中replace方法实例分析
2014/08/20 Python
Python解析json文件相关知识学习
2016/03/01 Python
Python双精度浮点数运算并分行显示操作示例
2017/07/21 Python
基于python 字符编码的理解
2017/09/02 Python
利用 python 对目录下的文件进行过滤删除
2017/12/27 Python
Python3 中文文件读写方法
2018/01/23 Python
python实现人脸识别经典算法(一) 特征脸法
2018/03/13 Python
Python判断是否json是否包含一个key的方法
2018/12/31 Python
Python开启线程,在函数中开线程的实例
2019/02/22 Python
Anaconda 查看、创建、管理和使用python环境的方法
2019/12/03 Python
Pytorch 定义MyDatasets实现多通道分别输入不同数据方式
2020/01/15 Python
Python文本文件的合并操作方法代码实例
2020/03/31 Python
教你如何一步一步用Canvas写一个贪吃蛇
2018/10/22 HTML / CSS
Oroton中国官网:澳洲知名奢侈配饰品牌
2017/03/26 全球购物
复古服装:RetroStage
2019/05/10 全球购物
如何用PHP实现邮件发送
2012/12/26 面试题
2015年幼儿园卫生保健工作总结
2015/05/12 职场文书
go mod 安装依赖 unkown revision问题的解决方案
2021/05/06 Golang
解决Mysql多行子查询的使用及空值问题
2022/01/22 MySQL
Python之matplotlib绘制饼图
2022/04/13 Python