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下实现在指定目录搜索指定类型文件的函数
Oct 03 PHP
php 正则表达式小结
Aug 31 PHP
PHP5权威编程阅读学习笔记 附电子书下载
Jul 05 PHP
ThinkPHP路由详解
Jul 27 PHP
PHP实现二叉树的深度优先与广度优先遍历方法
Sep 28 PHP
WordPress中对访客评论功能的一些优化方法
Nov 24 PHP
yii2 RBAC使用DbManager实现后台权限判断的方法
Jul 23 PHP
详解PHP使用Redis存储session时的一个Warning定位
Jul 05 PHP
kindeditor 加入七牛云上传的实例讲解
Nov 12 PHP
PHP流Streams、包装器wrapper概念与用法实例详解
Nov 17 PHP
thinkphp框架表单数组实现图片批量上传功能示例
Apr 04 PHP
如何用RabbitMQ和Swoole实现一个异步任务系统
May 29 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更新mysql后获取改变行数的方法
2014/12/25 PHP
js判断浏览器的比较全的代码
2007/02/13 Javascript
基于jquery的9行js轻松实现tab控件示例
2013/10/12 Javascript
javascript正则表达式之search()用法实例
2015/01/19 Javascript
jQuery插件ajaxFileUpload实现异步上传文件效果
2015/04/14 Javascript
图片上传之FileAPI与NodeJs
2017/01/24 NodeJs
原生javascript上传图片带进度条【实例分享】
2017/04/06 Javascript
深入理解基于vue-cli的vuex配置
2017/07/24 Javascript
微信小程序tabBar模板用法实例分析【附demo源码下载】
2017/11/28 Javascript
详解vue mixins和extends的巧妙用法
2017/12/20 Javascript
微信小程序websocket实现聊天功能
2020/03/30 Javascript
Vuejs2 + Webpack框架里,模拟下载的实例讲解
2018/09/05 Javascript
Vue文件配置全局变量的实例
2018/09/06 Javascript
代码分析vue中如何配置less
2018/09/28 Javascript
React 路由懒加载的几种实现方案
2018/10/23 Javascript
node实现简单的增删改查接口实例代码
2019/08/22 Javascript
Vue中跨域及打包部署到nginx跨域设置方法
2019/08/26 Javascript
解决vue watch数据的方法被调用了两次的问题
2020/11/07 Javascript
彻底理解Python list切片原理
2017/10/27 Python
Python 解决中文写入Excel时抛异常的问题
2018/05/03 Python
python绘制漏斗图步骤详解
2019/03/04 Python
解析python的局部变量和全局变量
2019/08/15 Python
关于python字符串方法分类详解
2019/08/20 Python
python3实现绘制二维点图
2019/12/04 Python
Tensorflow的梯度异步更新示例
2020/01/23 Python
在Python 的线程中运行协程的方法
2020/02/24 Python
html5小技巧之通过document.head获取head元素
2014/06/04 HTML / CSS
赫里福德的一家乡村零售商店:Philip Morris & Son
2017/06/25 全球购物
高中生校园生活自我评价
2013/09/19 职场文书
校园网站的创业计划书范文
2013/12/30 职场文书
劳动模范事迹材料
2014/01/19 职场文书
高中运动会广播稿
2014/01/21 职场文书
我们的节日清明节活动总结
2014/04/30 职场文书
投标人法定代表人授权委托书格式
2014/09/28 职场文书
离婚财产分割协议书
2015/08/11 职场文书
Spring依赖注入多种类型数据的示例代码
2022/03/31 Java/Android