php 使用html5 XHR2实现上传文件与进度显示功能示例


Posted in PHP onMarch 03, 2020

本文实例讲述了php 使用html5 XHR2实现上传文件与进度显示功能。分享给大家供大家参考,具体如下:

思路:只要我们知道上传文件的总大小,还有上传过程中上传文件的大小,那么就可以实现进度显示了。

在html5中,XMLHttpRequest对象,传送数据的时候,progress事件用来返回进度信息。

它分成上传和下载两种情况

1.下载的progress事件属于XMLHttpRequest对象
2.上传的progress事件属于XMLHttpRequest.upload对象。

与progress事件相关的,还有其他五个事件:

1.load事件:传输成功完成。
2.abort事件:传输被用户取消。
3.error事件:传输中出现错误。
4.loadstart事件:传输开始。
5.loadEnd事件:传输结束,但是不知道成功还是失败。

<!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>
  <div id="upStatus"></div>
</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);

    //监听上传事件
    xhr.upload.onprogress = function(ev) {
      //如果长度是可计算的
      if(ev.lengthComputable) {
        var percent = Math.round((ev.loaded / ev.total) * 100);
        document.getElementById("upStatus").innerHTML = percent + "%";
      }
    };

    //发送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";
}

如果上传过程中PHP出现如下信息:

Warning: POST Content-Length of 625523488 bytes exceeds the limit of 8388608 bytes in Unknown on line 0

说明文件大小超出了PHP设置限制,可以设置php.ini

;脚本解析输入数据(类似 POST 和 GET)允许的最大时间,单位是秒。

;它从接收所有数据到开始执行脚本进行测量的。
max_input_time = 60

;允许客户端单个POST请求发送的最大数据
post_max_size = 64M

;是否开启文件上传功能
file_uploads = On

;文件上传的临时存放目录(如果不指定,使用系统默认的临时目录)
;upload_tmp_dir =

;允许单个请求上传的最大文件大小
upload_max_filesize = 64M

;允许单个POST请求同时上传的最大文件数量
max_file_uploads = 20

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
php生成SessionID和图片校验码的思路和实现代码
Mar 10 PHP
PHP header函数分析详解
Aug 06 PHP
ThinkPHP 连接Oracle数据库的详细教程[全]
Jul 16 PHP
php中用date函数获取当前时间有误的解决办法
Aug 02 PHP
php密码生成类实例
Sep 24 PHP
Yii学习总结之数据访问对象 (DAO)
Feb 22 PHP
php利用gd库为图片添加水印
Nov 09 PHP
PHP输出图像imagegif、imagejpeg与imagepng函数用法分析
Nov 14 PHP
smarty模板数学运算示例
Dec 11 PHP
php简单构造json多维数组的方法示例
Jun 08 PHP
在Laravel 的 Blade 模版中实现定义变量
Oct 14 PHP
在 Laravel 中动态隐藏 API 字段的方法
Oct 25 PHP
php+ajax实现文件切割上传功能示例
Mar 03 #PHP
php 输出缓冲 Output Control用法实例详解
Mar 03 #PHP
PHP 加密 Password Hashing API基础知识点
Mar 02 #PHP
thinkphp5 + ajax 使用formdata提交数据(包括文件上传) 后台返回json完整实例
Mar 02 #PHP
php加速缓存器opcache,apc,xcache,eAccelerator原理与配置方法实例分析
Mar 02 #PHP
让whoops帮我们告别ThinkPHP6的异常页面
Mar 02 #PHP
php高性能日志系统 seaslog 的安装与使用方法分析
Feb 29 #PHP
You might like
php新建文件自动编号的思路与实现
2011/06/27 PHP
通过php添加xml文档内容的方法
2015/01/23 PHP
Laravel实现用户注册和登录
2015/01/23 PHP
PHP两种快速排序算法实例
2015/02/15 PHP
php中关于socket的系列函数总结
2015/05/18 PHP
php求今天、昨天、明天时间戳的简单实现方法
2016/07/28 PHP
php中__toString()方法用法示例
2016/12/07 PHP
解决thinkPHP 5 nginx 部署时,只跳转首页的问题
2019/10/16 PHP
javascript 鼠标滚轮事件
2009/04/09 Javascript
使用Js让Html中特殊字符不被转义
2013/11/05 Javascript
类似php的js数组的in_array函数自定义方法
2013/12/27 Javascript
浅析jQuery 3.0中的Data
2016/06/14 Javascript
JS获取input file绝对路径的方法(推荐)
2016/08/02 Javascript
JavaScript实战(原生range和自定义特效)简单实例
2016/08/21 Javascript
JavaScript获取URL中参数querystring的方法详解
2016/10/11 Javascript
详解如何使用Node.js编写命令工具——以vue-cli为例
2017/06/29 Javascript
如何理解Vue的render函数的具体用法
2017/08/30 Javascript
vue3.0 CLI - 3.2 路由的初级使用教程
2018/09/20 Javascript
让 babel webpack vue 配置文件支持智能提示的方法
2019/06/22 Javascript
Angular8基础应用之表单及其验证
2019/08/11 Javascript
JS中准确判断变量类型的方法
2020/06/01 Javascript
浅谈vue单页面中有多个echarts图表时的公用代码写法
2020/07/19 Javascript
Python实现线程池代码分享
2015/06/21 Python
Python解析json之ValueError: Expecting property name enclosed in double quotes: line 1 column 2(char 1)
2017/07/06 Python
python机器学习之神经网络(二)
2017/12/20 Python
Python使用matplotlib绘制三维图形示例
2018/08/25 Python
python实现栅栏加解密 支持密钥加密
2019/03/20 Python
python自动化测试三部曲之unittest框架的实现
2020/10/07 Python
C面试题
2015/10/08 面试题
学校经典推荐信
2013/10/30 职场文书
大学生入党自我鉴定
2013/10/31 职场文书
法定代表人身份证明书
2014/09/10 职场文书
2014年青年教师工作总结
2014/12/17 职场文书
给领导的感谢信范文
2015/01/23 职场文书
第一书记观后感
2015/06/08 职场文书
红高粱观后感
2015/06/10 职场文书