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 目录与文件处理-郑阿奇(续)
Jul 04 PHP
PHP基础知识回顾
Aug 16 PHP
php 定义404页面的实现代码
Nov 19 PHP
php实现高效获取图片尺寸的方法
Dec 12 PHP
PHP输出日历表代码实例
Mar 27 PHP
PHP借助phpmailer发送邮件
May 11 PHP
ThinkPHP V2.2说明文档没有说明的那些事实例小结
Jul 01 PHP
php 截取utf-8格式的字符串实例代码
Oct 30 PHP
PHP异步进程助手async-helper
Feb 05 PHP
Bootstrap+PHP实现多图上传功能实例详解
Apr 08 PHP
PHP7导出Excel报ERR_EMPTY_RESPONSE解决方法
Apr 16 PHP
php面试实现反射注入的详细方法
Sep 30 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 SPL标准库的用法(遍历目录,查找固定条件的文件)
2013/06/18 PHP
smarty中英文多编码字符截取乱码问题解决方法
2014/10/28 PHP
PHP使用trim函数去除字符串左右空格及特殊字符实例
2016/01/07 PHP
php脚本运行时的超时机制详解
2016/02/17 PHP
php实现xml与json之间的相互转换功能实例
2016/07/07 PHP
Laravel接收前端ajax传来的数据的实例代码
2017/07/20 PHP
实例讲解PHP页面静态化
2018/02/05 PHP
laravel5.2表单验证,并显示错误信息的实例
2019/09/29 PHP
PHP如何开启Opcache功能提升程序处理效率
2020/04/27 PHP
js操作textarea 常用方法总结
2012/12/03 Javascript
Javascript和HTML5利用canvas构建Web五子棋游戏实现算法
2013/07/17 Javascript
Js实现网页键盘控制翻页的方法
2014/10/30 Javascript
浅析JavaScript 调试方法和技巧
2015/10/22 Javascript
修改 bootstrap table 默认detailRow样式的实例代码
2017/07/21 Javascript
解决vue 路由变化页面数据不刷新的问题
2018/03/13 Javascript
JS实现的A*寻路算法详解
2018/12/14 Javascript
微信小程序整合使用富文本编辑器的方法详解
2019/04/25 Javascript
Node配合WebSocket做多文件下载以及进度回传
2019/11/07 Javascript
js中script的上下放置区别,Dom的增删改创建操作实例分析
2019/12/16 Javascript
JavaScript面向对象核心知识与概念归纳整理
2020/05/09 Javascript
基于python实现的抓取腾讯视频所有电影的爬虫
2016/04/22 Python
Python处理PDF及生成多层PDF实例代码
2017/04/24 Python
十分钟利用Python制作属于你自己的个性logo
2018/05/07 Python
Python 字符串与数字输出方法
2018/07/16 Python
dataframe 按条件替换某一列中的值方法
2019/01/29 Python
基于python实现坦克大战游戏
2020/10/27 Python
python 使用paramiko模块进行封装,远程操作linux主机的示例代码
2020/12/03 Python
params有什么用
2016/03/01 面试题
好人好事事迹材料
2014/02/12 职场文书
企业标语大全
2014/07/01 职场文书
党的群众路线教育实践活动督导组工作情况汇报
2014/10/28 职场文书
团组织推优材料
2014/12/29 职场文书
2015年党建工作总结
2015/03/30 职场文书
雷锋之歌观后感
2015/06/10 职场文书
导游词之上海东方明珠塔
2019/09/25 职场文书
导游词之山东孔庙
2019/11/04 职场文书