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.ini中的php-5.2.0配置指令详解
Mar 27 PHP
PHP 开发环境配置(Zend Server安装)
Apr 28 PHP
PHP 使用redis简单示例分享
Mar 05 PHP
php通过前序遍历树实现无需递归的无限极分类
Jul 10 PHP
PHP的Yii框架的常用日志操作总结
Dec 08 PHP
PHP模板引擎Smarty内建函数foreach,foreachelse用法分析
Apr 11 PHP
PHP 二级子目录(后台目录)设置二级域名
Mar 02 PHP
PHP 7.0新增加的特性介绍
Jun 08 PHP
解决thinkPHP 5 nginx 部署时,只跳转首页的问题
Oct 16 PHP
thinkphp5 模型实例化获得数据对象的教程
Oct 18 PHP
PHP Pipeline 实现中间件的示例代码
Apr 26 PHP
PHP7移除的扩展和SAPI
Mar 09 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 MVC模式在网站架构中的实现分析
2010/03/04 PHP
PHP中CURL方法curl_setopt()函数的参数分享
2013/01/19 PHP
PHP读取汉字的点阵数据
2015/06/22 PHP
详解使用php调用微信接口上传永久素材
2017/04/11 PHP
PHP curl批处理及多请求并发实现方法分析
2018/08/15 PHP
js将控件隐藏及display属性的使用介绍
2013/12/30 Javascript
javascript中HTMLDOM操作详解
2014/12/11 Javascript
全面解析bootstrap格子布局
2016/05/22 Javascript
jQuery实现倒计时重新发送短信验证码功能示例
2017/01/12 Javascript
layui表格实现代码
2017/05/20 Javascript
React Native中Navigator的使用方法示例
2017/10/13 Javascript
利用SpringMVC过滤器解决vue跨域请求的问题
2018/02/10 Javascript
Angular HMR(热模块替换)功能实现方法
2018/04/04 Javascript
JavaScript内置对象之Array的使用小结
2020/05/12 Javascript
浅析Python中的赋值和深浅拷贝
2017/08/15 Python
Python堆排序原理与实现方法详解
2018/05/11 Python
django 2.2和mysql使用的常见问题
2019/07/18 Python
dpn网络的pytorch实现方式
2020/01/14 Python
Python基于当前时间批量创建文件
2020/05/07 Python
浅谈keras.callbacks设置模型保存策略
2020/06/18 Python
python 发送get请求接口详解
2020/11/17 Python
Paradigit比利时电脑卖场:购买笔记本、电脑、平板和外围设备
2016/11/28 全球购物
Raleigh兰令自行车美国官网:英国凤头牌自行车
2018/01/08 全球购物
Hoka One One法国官网:美国专业跑鞋品牌
2018/12/29 全球购物
Bose英国官方网站:美国知名音响品牌
2020/01/26 全球购物
PHP面试题及答案二
2015/05/23 面试题
应届生幼儿园求职信
2013/11/12 职场文书
硕士研究生自我鉴定范文
2013/12/27 职场文书
小学美术教学反思
2014/02/01 职场文书
大学生就业求职信
2014/06/12 职场文书
思想作风建设心得体会
2014/10/22 职场文书
2014年留守儿童工作总结
2014/12/10 职场文书
院系推荐意见
2015/06/05 职场文书
平凡的世界读书笔记
2015/06/25 职场文书
2016年五一促销广告语
2016/01/28 职场文书
苹果可能正在打击不进行更新的 App
2022/04/24 数码科技