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编写大型网站问题集
Mar 06 PHP
PHP 巧用数组降低程序的时间复杂度
Jan 01 PHP
解析thinkphp中的M()与D()方法的区别
Jun 22 PHP
页面乱码问题的根源及其分析
Aug 09 PHP
PHP图片自动裁切应付不同尺寸的显示
Oct 16 PHP
PHP中的事务使用实例
May 26 PHP
PHP编写daemon process 实例详解
Nov 13 PHP
laravel ORM 只开启created_at的几种方法总结
Jan 29 PHP
win7 wamp 64位 php环境开启curl服务遇到的问题及解决方法
Sep 16 PHP
Laravel实现ORM带条件搜索分页
Oct 24 PHP
Laravel5.5 动态切换多语言的操作方式
Oct 25 PHP
PHP如何使用array_unshift()在数组开头插入元素
Sep 01 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的问题分析及解决
2013/05/16 PHP
详解WordPress中调用评论模板和循环输出评论的PHP函数
2016/01/05 PHP
crontab无法执行php的解决方法
2016/01/25 PHP
Yii中特殊行为ActionFilter的使用方法示例
2020/10/18 PHP
js 发个判断字符串是否为符合标准的函数
2009/04/27 Javascript
表单元素事件 (Form Element Events)
2009/07/17 Javascript
javascript实现日期格式转换
2014/12/16 Javascript
使用vue.js开发时一些注意事项
2016/04/27 Javascript
Bootstrap自动适应PC、平板、手机的Bootstrap栅格系统
2016/05/27 Javascript
js 获取站点应用名的简单实例
2016/08/18 Javascript
详解Node.Js如何处理post数据
2016/09/19 Javascript
javascript图片预览和上传(兼容IE)
2017/03/15 Javascript
jQuery加密密码到cookie的实现代码
2017/04/18 jQuery
Bootstrap Table使用整理(三)
2017/06/09 Javascript
微信小程序中吸底按钮适配iPhone X方案
2017/11/29 Javascript
Postman模拟发送带token的请求方法
2018/03/31 Javascript
从组件封装看Vue的作用域插槽的实现
2019/02/12 Javascript
js核心基础之闭包的应用实例分析
2019/05/11 Javascript
vue-element-admin 菜单标签失效的解决方式
2019/11/12 Javascript
Python版的文曲星猜数字游戏代码
2013/09/02 Python
Python3.x爬虫下载网页图片的实例讲解
2018/05/22 Python
Python爬取qq空间说说的实例代码
2018/08/17 Python
PyQt5固定窗口大小的方法
2019/06/18 Python
Django CBV与FBV原理及实例详解
2019/08/12 Python
python模式 工厂模式原理及实例详解
2020/02/11 Python
Python 基于jwt实现认证机制流程解析
2020/06/22 Python
python 实现网易邮箱邮件阅读和删除的辅助小脚本
2021/03/01 Python
使用CSS3制作倾斜导航条和毛玻璃效果
2017/09/12 HTML / CSS
阿迪达斯比利时官方商城:adidas比利时
2016/10/10 全球购物
泰坦健身器材:Titan Fitness
2018/02/13 全球购物
颁奖典礼主持词
2014/03/25 职场文书
党员个人对照检查材料范文
2014/09/24 职场文书
群众路线查摆问题及整改措施
2014/10/10 职场文书
2014年办公室主任工作总结
2014/11/12 职场文书
公共场所卫生管理制度
2015/08/05 职场文书
微信早安问候语
2015/11/10 职场文书