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 31 PHP
php页面消耗内存过大的处理办法
Mar 18 PHP
php使用fopen创建utf8编码文件的方法
Oct 31 PHP
php生成gif动画的方法
Nov 05 PHP
PHP Ajax JavaScript Json获取天气信息实现代码
Aug 17 PHP
php魔法函数与魔法常量使用介绍
Jul 23 PHP
thinkphp分页集成实例
Jul 24 PHP
PHP 断点续传实例详解
Nov 11 PHP
PHP ADODB生成HTML表格函数rs2html功能【附错误处理函数用法】
May 29 PHP
php中青蛙跳台阶的问题解决方法
Oct 14 PHP
PHP学习记录之常用的魔术常量详解
Dec 12 PHP
PHP文件操作简单介绍及函数汇总
Dec 11 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之第十天
2006/10/09 PHP
php为什么选mysql作为数据库? Mysql 创建用户方法
2007/07/02 PHP
php防止恶意刷新与刷票的方法
2014/11/21 PHP
smarty实现多级分类的方法
2014/12/05 PHP
php中文验证码实现方法
2015/06/18 PHP
PHP使用array_merge重新排列数组下标的方法
2015/07/22 PHP
php使用gzip压缩传输js和css文件的方法
2015/07/29 PHP
php 查找数组元素提高效率的方法详解
2017/05/05 PHP
PHP 中TP5 Request 请求对象的实例详解
2017/07/31 PHP
thinkPHP+mysql+ajax实现的仿百度一下即时搜索效果详解
2019/07/15 PHP
jQuery的学习步骤
2011/02/23 Javascript
jquery获取div宽度的实现思路与代码
2013/01/13 Javascript
基于jquery实现点击左右按钮图片横向滚动
2013/04/11 Javascript
在Javascript中 声明时用&quot;var&quot;与不用&quot;var&quot;的区别
2013/04/15 Javascript
IE、FF浏览器下修改标签透明度
2014/01/28 Javascript
ie浏览器使用js导出网页到excel并打印
2014/03/11 Javascript
JS弹出新窗口被拦截的解决方法
2016/08/09 Javascript
JS变量及其作用域
2017/03/29 Javascript
ES6 Map结构的应用实例分析
2019/06/26 Javascript
layer.open弹层查看缩略图的原图,自适应大小的实例
2019/09/05 Javascript
JavaScript之Blob对象类型的具体使用方法
2019/11/29 Javascript
vuejs中父子组件之间通信方法实例详解
2020/01/17 Javascript
Python实现一个转存纯真IP数据库的脚本分享
2017/05/21 Python
Python优先队列实现方法示例
2017/09/21 Python
python中os和sys模块的区别与常用方法总结
2017/11/14 Python
使用python 爬虫抓站的一些技巧总结
2018/01/10 Python
Django+Xadmin构建项目的方法步骤
2019/03/06 Python
发现世界上最好的珠宝设计师:JewelStreet
2017/12/17 全球购物
Champion澳大利亚官网:美国冠军运动服装
2018/05/07 全球购物
群众路线个人对照检查材料
2014/09/23 职场文书
职工擅自离岗检讨书
2014/09/23 职场文书
年底个人总结范文
2015/03/10 职场文书
2016春季运动会通讯稿
2015/07/18 职场文书
iPhone13将有八大升级
2021/04/15 数码科技
深入讲解Vue中父子组件通信与事件触发
2022/03/22 Vue.js