php实现简单的上传进度条


Posted in PHP onNovember 17, 2015

Web上传文件的三种解决方案分享给大家:

php实现简单的上传进度条

这里我要使用的是form法。通过为表单元素设置enctype=”multipart/form-data”属性,让表单提交的数据以二进制编码的方式提交,在接收此请求的Servlet中用二进制流来获取内容,就可以取得上传文件的内容,从而实现文件的上传。

表单元素的enctype属性指定的是表单数据的编码方式,该属性有3个值:

 php实现简单的上传进度条

在网上找到了两种方式,PHP配合apc实现和利用uploadprogress实现,这次我要使用的是uploadprogress,点击地址可以下载到php相应版本的dll。安装php_uploadprogress.dll扩展,重启apache。

php实现简单的上传进度条

进度条实现原理:

php实现简单的上传进度条

这里用到了一个iframe无刷新上传文件的方法。

php实现简单的上传进度条

上传完成后的样子如图:

<body>
  <div style="padding:20px">
   <form action="action.php" enctype="multipart/form-data" method="post" target="iframeUpload">
    <iframe name="iframeUpload" width="400" height="400" frameborder='1'></iframe>
    <input type="hidden" name="UPLOAD_IDENTIFIER" value="1" />
    <input id="file1" name="file1" type="file"/> 
    <input value="上传" type="submit" onclick="startProgress()"/> 
   </form>
  </div>
  <div style="width: 500px; height: 20px;border:1px solid red"> 
   <div style="position: relative; height: 20px; background-color: purple; width: 0%;" class="barinner"></div>
  </div>
  <div id='showNum'></div>
  <div class="prbar">
   <div class="prpos barinner"></div>
  </div>
 </body>

上面的HTML代码中要注意下UPLOAD_IDENTIFIER,这个是用来定位查看哪个文件的上传进度的。我这里就写死为一个1,大家可以写成一个php生成的随机数。下面是JS脚本:

var proNum=0; 
  var loop=0; 
  var progressResult = ""; 
  var interval; 
  function sendURL() { 
   $.ajax({ 
    type : 'GET', 
    url : "getprogress.php", 
    async : true, 
    cache : false, 
    dataType : 'json',
    data: "progress_key=" + $('input[name=UPLOAD_IDENTIFIER]').val(),
    success : function(e) { 
     proNum=parseInt(e); 
     if(e){ 
      $('.barinner').css('width', proNum+"%");
      $('#showNum').html(proNum+"%");
      setTimeout("getProgress()", 200); 
   
     }else{ 
      if(interval == 1){ 
       $('.barinner').css('width', "100%");
       $('#showNum').html("100%");
      } 
     }
    } 
   }); 
  } 
  function getProgress(){ 
   loop++; 
   sendURL(); 
  } 
  function startProgress(){ 
   interval = 1;
   $('.barinner').css('width', proNum+"%"); 
   $('#showNum').html(proNum+"%");
  setTimeout("getProgress()", 500); 
  }

下面是getprogress.php文件中的内容:

<?php 
 if (function_exists("uploadprogress_get_info")) {
  $info = uploadprogress_get_info($_GET['progress_key']);
  if(!empty($info)){
   if(($info['bytes_uploaded'] < $info['bytes_total']) && !empty($info['bytes_uploaded']) && !empty($info['bytes_total'])){
    $proNum = floor(($info['bytes_uploaded']/$info['bytes_total'])*100);  
   }else{
    $proNum = 100;
   }
   echo $proNum;
  }else{
   echo 0;
  }
 }

在上传完成后,我展示了两种进度条的CSS,第二种是用最新的CSS3写的。用到了一些CSS3的动画属性。

php实现简单的上传进度条

.prbar {
  margin:5px;
  width:500px;
  background-color:#dddddd;
  overflow:hidden;
  
  /* 边框效果 */
  border: 1px solid #bbbbbb;
  -moz-border-radius: 15px;
  border-radius: 15px;
    
  /* 为进度条增加阴影效果 */
  -webkit-box-shadow: 0px 2px 4px #555555;
  -moz-box-shadow: 0px 2px 4px #555555;
  box-shadow: 0px 2px 4px #555555;   
 }
 /* No rounded corners for Opera, because the overflow:hidden dont work with rounded corners */
 doesnotexist:-o-prefocus, .prbar {
 border-radius:0px;
 }
 .prpos {
  width:0%;
  height:30px;
  background-color:#3399ff;
  border-right:1px solid #bbbbbb;
  /* CSS3 进度条渐变 */
  transition: width 2s ease;
  -webkit-transition: width 0s ease;
  -o-transition: width 0s ease;
  -moz-transition: width 0s ease;
  -ms-transition: width 0s ease;
  /* CSS3 Stripes */
  background-image: linear-gradient(135deg,#3399ff 25%,#99ccff 25%,#99ccff 50%, #3399ff 50%, #3399ff 75%,#99ccff 75%,#99ccff 100%);
  background-image: -moz-linear-gradient(135deg,#3399ff 25%,#99ccff 25%,#99ccff 50%, #3399ff 50%, #3399ff 75%,#99ccff 75%,#99ccff 100%);
  background-image: -ms-linear-gradient(135deg,#3399ff 25%,#99ccff 25%,#99ccff 50%, #3399ff 50%, #3399ff 75%,#99ccff 75%,#99ccff 100%);
  background-image: -o-linear-gradient(135deg,#3399ff 25%,#99ccff 25%,#99ccff 50%, #3399ff 50%, #3399ff 75%,#99ccff 75%,#99ccff 100%);
  background-image: -webkit-gradient(linear, 100% 100%, 0 0,color-stop(.25, #99ccff), color-stop(.25, #3399ff),color-stop(.5, #3399ff),color-stop(.5, #99ccff),color-stop(.75, #99ccff),color-stop(.75, #3399ff),color-stop(1, #3399ff));
  background-image: -webkit-linear-gradient(135deg,#3399ff 25%,#99ccff 25%,#99ccff 50%, #3399ff 50%, #3399ff 75%,#99ccff 75%,#99ccff 100%);
  background-size: 40px 40px;
  /* Background stripes animation */
  animation: bganim 3s linear 2s infinite;
  -moz-animation: bganim 3s linear 2s infinite;
  -webkit-animation: bganim 3s linear 2s infinite;
  -o-animation: bganim 3s linear 2s infinite;
  -ms-animation: bganim 3s linear 2s infinite;
 }
 @keyframes bganim {
  from {background-position:0px;} to { background-position:40px;}
 }
 @-moz-keyframes bganim {
  from {background-position:0px;} to { background-position:40px;}
 }
 @-webkit-keyframes bganim {
  from {background-position:0px;} to { background-position:40px;}
 }
 @-o-keyframes bganim {
  from {background-position:0px;} to { background-position:40px;}
 }
 @-ms-keyframes bganim {
  from {background-position:0px;} to { background-position:40px;}
 }

以上就是本文的全部内容,希望对大家的学习有所帮助。

PHP 相关文章推荐
用 PHP5 轻松解析 XML
Dec 04 PHP
编写漂亮的代码 - 将后台程序与前端程序分开
Apr 23 PHP
攻克CakePHP系列三 表单数据增删改
Oct 22 PHP
PHP访问MYSQL数据库封装类(附函数说明)
Dec 04 PHP
PHP curl 获取响应的状态码的方法
Jan 13 PHP
网站防止被刷票的一些思路与方法
Jan 08 PHP
php简单获取目录列表的方法
Mar 24 PHP
php如何实现只替换一次或N次
Oct 29 PHP
laravel5.2实现区分前后台用户登录的方法
Jan 11 PHP
PHP验证码无法显示的原因及解决办法
Aug 11 PHP
php两点地理坐标距离的计算方法
Dec 29 PHP
laravel 出现command not found问题的解决方案
Oct 23 PHP
PHP安装threads多线程扩展基础教程
Nov 17 #PHP
超详细的php用户注册页面填写信息完整实例(附源码)
Nov 17 #PHP
教大家制作简单的php日历
Nov 17 #PHP
PHP YII框架开发小技巧之模型(models)中rules自定义验证规则
Nov 16 #PHP
PHP Yii框架之表单验证规则大全
Nov 16 #PHP
Yii2.0高级框架数据库增删改查的一些操作
Nov 16 #PHP
yii添删改查实例
Nov 16 #PHP
You might like
一步一步学习PHP(8) php 数组
2010/03/05 PHP
php DOS攻击实现代码(附如何防范)
2012/05/29 PHP
解决laravel groupBy 对查询结果进行分组出现的问题
2019/10/09 PHP
javascript 解析后的xml对象的读取方法细解
2009/07/25 Javascript
script标签的 charset 属性使用说明
2010/12/04 Javascript
jquery中dom操作和事件的实例学习-表单验证
2011/11/30 Javascript
js实现一个省市区三级联动选择框代码分享
2013/03/06 Javascript
jquery+css+ul模拟列表菜单具体实现思路
2013/04/15 Javascript
String.prototype实现的一些javascript函数介绍
2013/11/22 Javascript
javascript中数组中求最大值示例代码
2013/12/18 Javascript
node.js使用npm 安装插件时提示install Error: ENOENT报错的解决方法
2014/11/20 Javascript
ECMAScript6函数默认参数
2015/06/12 Javascript
浅谈Javascript中的Label语句
2016/12/14 Javascript
node.js爬虫爬取拉勾网职位信息
2017/03/14 Javascript
js实现拖拽上传图片功能
2017/08/01 Javascript
JavaScript中this关键字用法实例分析
2018/08/24 Javascript
vue实现div拖拽互换位置
2020/07/29 Javascript
javascript获取select值的方法完整实例
2019/06/20 Javascript
JS+HTML实现自定义上传图片按钮并显示图片功能的方法分析
2020/02/12 Javascript
[01:02:47]EG vs Secret 2019国际邀请赛淘汰赛 胜者组 BO3 第一场 8.21.mp4
2020/07/19 DOTA
Python机器学习k-近邻算法(K Nearest Neighbor)实例详解
2018/06/25 Python
tensorflow 实现自定义layer并添加到计算图中
2020/02/04 Python
Python 解析pymysql模块操作数据库的方法
2020/02/18 Python
新建文件时Pycharm中自动设置头部模板信息的方法
2020/04/17 Python
python中取绝对值简单方法总结
2020/07/24 Python
使用phonegap操作数据库的实现方法
2017/03/31 HTML / CSS
Myprotein俄罗斯官网:欧洲第一运动营养品牌
2019/05/05 全球购物
红色故事演讲稿
2014/05/22 职场文书
调研汇报材料范文
2014/08/17 职场文书
中学生的1000字检讨书
2014/10/11 职场文书
敲诈同学钱财检讨书范文
2014/11/18 职场文书
学生检讨书怎么写
2015/05/07 职场文书
家长意见和建议怎么写
2015/06/04 职场文书
Nginx中break与last的区别详析
2021/03/31 Servers
php引用传递
2021/04/01 PHP
德劲DE1107指针试高灵敏度全波段收音机机评
2022/04/05 无线电