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&amp;&amp;mysql)二
Oct 09 PHP
使用 MySQL Date/Time 类型
Mar 26 PHP
php 生成饼图 三维饼图
Sep 28 PHP
redis 队列操作的例子(php)
Apr 12 PHP
php smarty truncate UTF8乱码问题解决办法
Jun 13 PHP
php获取网页请求状态程序示例
Jun 17 PHP
高性能PHP框架Symfony2经典入门教程
Jul 08 PHP
帝国CMS留言板回复后发送EMAIL通知客户
Jul 06 PHP
Zend Framework教程之Zend_Config_Xml用法分析
Mar 23 PHP
php读取qqwry.dat ip地址定位文件的类实例代码
Nov 15 PHP
PHP精确计算功能示例
Nov 29 PHP
PHP使用mysqli操作MySQL数据库的简单方法
Feb 04 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获取类中常量,属性,及方法列表的方法
2009/04/09 PHP
php foreach、while性能比较
2009/10/15 PHP
php实现删除指定目录下相关文件的方法
2014/10/20 PHP
PHP信号量基本用法实例详解
2016/02/12 PHP
PHP编程实现csv文件导入mysql数据库的方法
2017/04/29 PHP
jQuery 打造动态下滑菜单实现说明
2010/04/15 Javascript
javascript 从if else 到 switch case 再到抽象
2010/07/17 Javascript
js 实现图片预加载(js操作 Image对象属性complete ,事件onload 异步加载图片)
2011/03/25 Javascript
javascript 实现字符串反转的三种方法
2013/11/23 Javascript
浅谈javascript 函数属性和方法
2015/01/21 Javascript
Javascript中3个需要注意的运算符
2015/04/02 Javascript
轻松实现Bootstrap图片轮播
2020/04/20 Javascript
BootStrap扔进Django里的方法详解
2016/05/13 Javascript
JS实现复制内容到剪贴板功能兼容所有浏览器(推荐)
2016/06/17 Javascript
Javascript中关于Array.filter()的妙用详解
2016/12/04 Javascript
AngularJS select设置默认值的实现方法
2017/08/25 Javascript
详解Vue.js在页面加载时执行某个方法
2018/11/20 Javascript
详解React项目如何修改打包地址(编译输出文件地址)
2019/03/21 Javascript
微信小程序基于movable-view实现滑动删除效果
2020/01/08 Javascript
es6函数之rest参数用法实例分析
2020/04/18 Javascript
vue-router之解决addRoutes使用遇到的坑
2020/07/19 Javascript
[45:38]DOTA2上海特级锦标赛主赛事日 - 1 胜者组第一轮#1Liquid VS Alliance第一局
2016/03/02 DOTA
[01:32]DOTA2上海特锦赛现场采访:最想COS的英雄
2016/03/25 DOTA
python tensorflow基于cnn实现手写数字识别
2018/01/01 Python
Python读取视频的两种方法(imageio和cv2)
2018/04/15 Python
Python实现简单石头剪刀布游戏
2021/01/20 Python
在Python中画图(基于Jupyter notebook的魔法函数)
2019/10/28 Python
Python对称的二叉树多种思路实现方法
2020/02/28 Python
tensorflow 动态获取 BatchSzie 的大小实例
2020/06/30 Python
GNC健安喜官方海外旗舰店:美国著名保健品牌
2017/01/04 全球购物
高性能钓鱼服装:Huk Gear
2019/02/20 全球购物
德国专业木制品经销商:Holz-Direkt24
2019/12/26 全球购物
网络、C以及其他硬件方面的面试题
2016/08/23 面试题
2014年变电站工作总结
2014/12/19 职场文书
《梅花魂》教学反思
2016/02/18 职场文书
Python 的 sum() Pythonic 的求和方法详细
2021/10/16 Python