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 相关文章推荐
谈谈PHP的输入输出流
Feb 14 PHP
用js进行url编码后用php反解以及用php实现js的escape功能函数总结
Feb 08 PHP
php上的memcache和memcached两个pecl库
Mar 29 PHP
PHP实现自动登入google play下载app report的方法
Sep 23 PHP
PHP依赖倒置(Dependency Injection)代码实例
Oct 11 PHP
PHP版微信公众平台红包API
Apr 02 PHP
php自定义类fsocket模拟post或get请求的方法
Jul 31 PHP
简单的pgsql pdo php操作类实现代码
Aug 25 PHP
PHP实现权限管理功能示例
Sep 22 PHP
PHP+MySQL实现在线测试答题实例
Jan 02 PHP
php操作redis数据库常见方法实例总结
Feb 20 PHP
PHP遍历数组的6种方式总结
Nov 17 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 动态生成静态HTML页面示例代码
2014/01/15 PHP
php中mysql操作buffer用法详解
2015/03/19 PHP
Linux+Nginx+MySQL下配置论坛程序Discuz的基本教程
2015/12/23 PHP
php array_udiff_assoc 计算两个数组的差集实例
2016/11/12 PHP
jQuery 学习第五课 Ajax 使用说明
2010/05/17 Javascript
javascript 数组排序函数sort和reverse使用介绍
2013/11/21 Javascript
nodejs读取memcache示例分享
2014/01/02 NodeJs
js判断浏览器是否支持html5
2014/08/17 Javascript
jQuery对指定元素中指定字符串进行替换的方法
2015/03/17 Javascript
jquery获得当前html页面源码的方法
2015/07/14 Javascript
jQuery焦点图左右转换效果
2016/12/12 Javascript
bootstrap表单按回车会自动刷新页面的解决办法
2017/03/08 Javascript
JS实现向iframe中表单传值的方法
2017/03/24 Javascript
Webpack打包css后z-index被重新计算的解决方法
2017/06/18 Javascript
Angular 4中如何显示内容的CSS样式示例代码
2017/11/06 Javascript
原生JS控制多个滚动条同步跟随滚动效果
2017/12/22 Javascript
前端MVVM框架解析之双向绑定
2018/01/24 Javascript
Bootstrap 中data-[*] 属性的整理
2018/03/13 Javascript
详解ESLint在Vue中的使用小结
2018/10/15 Javascript
Vue实现日历小插件
2019/06/26 Javascript
javascript 对象 与 prototype 原型用法实例分析
2019/11/11 Javascript
js实现AI五子棋人机大战
2020/05/28 Javascript
在Python程序中实现分布式进程的教程
2015/04/28 Python
简单谈谈Python中的元祖(Tuple)和字典(Dict)
2017/04/21 Python
详谈Python基础之内置函数和递归
2017/06/21 Python
matplotlib绘制动画代码示例
2018/01/02 Python
python爬虫模拟浏览器的两种方法实例分析
2019/12/09 Python
python3爬虫中多线程进行解锁操作实例
2020/11/25 Python
HTML页面中添加Canvas标签示例
2015/01/01 HTML / CSS
日本化妆品植村秀俄罗斯官方网站:Shu Uemura俄罗斯
2020/02/01 全球购物
俄罗斯第一家篮球店:StreetBall
2020/07/30 全球购物
Java 中访问数据库的步骤?Statement 和PreparedStatement 之间的区别?
2012/06/05 面试题
一份教室追逐打闹的检讨书
2014/09/27 职场文书
扶贫办主任查摆“四风”问题个人对照检查材料思想汇报
2014/10/02 职场文书
政风行风整改报告
2014/11/06 职场文书
tomcat正常启动但网页却无法访问的几种解决方法
2022/05/06 Servers