基于JS实现视频上传显示进度条


Posted in Javascript onMay 12, 2020

示例代码:

css部分:

#content{border: 1px solid saddlebrown;padding: 16px;border-radius: 2px}
  .list {top: 15px;width: 140px;height: 40px; border:1px solid #0082E6; display:inline-block;border-radius: 2px;position: relative; line-height: 40px;}  
  #file{position: absolute;opacity: 0;color:white;width: 100%;height: 100%;z-index: 100;}
  .list span{
    display: inline-block;
    text-align: center;
    width: 100%;
    line-height: 40px;
    position: absolute;
    color: #0082E6;
  }
  video{
    margin-top: 8px;
    border-radius: 4px;
  }
  ._p{
    margin: 14px;
  }
  ._p input{
    display: inline-block;
    width: 70%;
    margin-left: 6px;
  }
  ._p span{
    font-size: 15px;
  }

html部分

<div id="content" >
   <p class="_p"><span>视频标题</span>:<input id="title" type="text" class="form-control" placeholder="请输入视频名称"></p>
   <p class="_p">
     <span>选择视频: </span>
     <!--文件选择按钮-->
    <a class="list" href="javascript:;" rel="external nofollow" > 
      <input id="file" type="file" name="myfile" onchange="UpladFile();" /><span>选择视频</span>
    </a> 
    <!--上传速度显示-->
    <span id="time"></span> 
   </p>
   <!--显示消失-->
   <ul class="el-upload-list el-upload-list--text" style="display: none;">
     <li tabindex="0" class="el-upload-list__item is-success" >
       <a class="el-upload-list__item-name">
         <i class="el-icon-document"></i><span id="videoName">food.jpeg</span>
    </a> 
    <label class="el-upload-list__item-status-label" >
      <i class="el-icon-upload-success el-icon-circle-check" ></i>
    </label>
    <i class="el-icon-close" onclick="del();"></i>
    <i class="el-icon-close-tip"></i>
     </li>
   </ul>
  
  <!--进度条-->
  <div class="el-progress el-progress--line" style="display: none;">
    <div class="el-progress-bar">
      <div class="el-progress-bar__outer" style="height: 6px;">
        <div class="el-progress-bar__inner" style="width: 0%;">
        </div>
      </div>
    </div>
    <div class="el-progress__text" style="font-size: 14.4px;">0%</div>
  </div>
  <p class="_p"><span>上传视频</span>:<button class="btn btn-primary" type="button" onclick="sub();">上传</button></p>
  
  <!--预览框-->
  <div class="preview">
    
  </div>
  </div>

js部分:

<script type="text/javascript"> 
  var xhr;//异步请求对象
  var ot; //时间
  var oloaded;//大小
  //上传文件方法
  function UpladFile() {
    var fileObj = document.getElementById("file").files[0]; // js 获取文件对象
    if(fileObj.name){
      $(".el-upload-list").css("display","block");
      $(".el-upload-list li").css("border","1px solid #20a0ff");
      $("#videoName").text(fileObj.name);
    }else{
      alert("请选择文件");
    }
  }
  /*点击取消*/
  function del(){
    $("#file").val('');
    $(".el-upload-list").css("display","none");
  }
  /*点击提交*/
  function sub(){
    var fileObj = document.getElementById("file").files[0]; // js 获取文件对象
    if(fileObj==undefined||fileObj==""){
      alert("请选择文件");
      return false;
    };
    var title = $.trim($("#title").val());
    if(title==''){
      alert("请填写视频标题");
      return false;
    }
    var url = "{php echo webUrl('goods/iframe.upload')}"; // 接收上传文件的后台地址 
    var form = new FormData(); // FormData 对象
    form.append("mf", fileObj); // 文件对象 
    form.append("title", title); // 标题
    xhr = new XMLHttpRequest(); // XMLHttpRequest 对象
    xhr.open("post", url, true); //post方式,url为服务器请求地址,true 该参数规定请求是否异步处理。
    xhr.onload = uploadComplete; //请求完成
    xhr.onerror = uploadFailed; //请求失败
    xhr.upload.onprogress = progressFunction; //【上传进度调用方法实现】
    xhr.upload.onloadstart = function() { //上传开始执行方法
      ot = new Date().getTime(); //设置上传开始时间
      oloaded = 0; //设置上传开始时,以上传的文件大小为0
    };
    xhr.send(form); //开始上传,发送form数据
  }
  
  //上传进度实现方法,上传过程中会频繁调用该方法
  function progressFunction(evt) { 
    // event.total是需要传输的总字节,event.loaded是已经传输的字节。如果event.lengthComputable不为真,则event.total等于0
    if(evt.lengthComputable) {
      $(".el-progress--line").css("display","block");
      /*进度条显示进度*/
      $(".el-progress-bar__inner").css("width", Math.round(evt.loaded / evt.total * 100) + "%");
      $(".el-progress__text").html(Math.round(evt.loaded / evt.total * 100)+"%");  
    }

    var time = document.getElementById("time");
    var nt = new Date().getTime(); //获取当前时间
    var pertime = (nt - ot) / 1000; //计算出上次调用该方法时到现在的时间差,单位为s
    ot = new Date().getTime(); //重新赋值时间,用于下次计算

    var perload = evt.loaded - oloaded; //计算该分段上传的文件大小,单位b 
    oloaded = evt.loaded; //重新赋值已上传文件大小,用以下次计算

    //上传速度计算
    var speed = perload / pertime; //单位b/s
    var bspeed = speed;
    var units = 'b/s'; //单位名称
    if(speed / 1024 > 1) {
      speed = speed / 1024;
      units = 'k/s';
    }
    if(speed / 1024 > 1) {
      speed = speed / 1024;
      units = 'M/s';
    }
    speed = speed.toFixed(1);
    //剩余时间
    var resttime = ((evt.total - evt.loaded) / bspeed).toFixed(1);
    time.innerHTML = '上传速度:' + speed + units + ',剩余时间:' + resttime + 's';
    if(bspeed == 0)
      time.innerHTML = '上传已取消';
  }
  //上传成功响应
  function uploadComplete(evt) {
    //服务断接收完文件返回的结果 注意返回的字符串要去掉双引号
    if(evt.target.responseText){
      var str = "../shiping/"+evt.target.responseText;
      alert("上传成功!");
      $(".preview").append("<video controls='' autoplay='' name='media'><source src="+str+" type='video/mp4'></video>");
    }else{
      alert("上传失败");
    }
  }
  //上传失败
  function uploadFailed(evt) {
    alert("上传失败!");
  }
</script>

后台用PHP实现

//视频上传
  public function upload(){
    global $_W;
    global $_GPC;
    $fileArr = $_FILES['mf'];
    $title = $_GPC['title'];
    /*var_dump($title);
    exit;*/
    //设置预览目录,上传成功的路径 
    $previewPath = "../shiping/";
    $ext = pathinfo($fileArr['name'], PATHINFO_EXTENSION);//获取当前上传文件扩展名 
    $arrExt = array('3gp','rmvb','flv','wmv','avi','mkv','mp4','mp3','wav',);
    
    if(!in_array($ext,$arrExt)) {
       exit(json_encode(-1,JSON_UNESCAPED_UNICODE));//视/音频或采用了不合适的扩展名!  
    } else {       
        //文件上传到预览目录   
        $previewName = 'pre_'.md5(mt_rand(1000,9999)).time().'.'.$ext; //文件重命名 
        $previewSrc = $previewPath.$previewName;
        
        if(move_uploaded_file($fileArr['tmp_name'],$previewSrc)){//上传文件操作,上传失败的操作
           exit($previewName);
        } else {
          //上传成功的失败的操作
          exit(json_encode(0,JSON_UNESCAPED_UNICODE));
        }    
    } 
  }

实现效果:

选择视频

基于JS实现视频上传显示进度条

上传中........

基于JS实现视频上传显示进度条

上传完成

基于JS实现视频上传显示进度条

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js模仿jquery的写法示例代码
Jun 16 Javascript
jQuery轻松实现表格的隔行变色和点击行变色的实例代码
May 09 Javascript
jQuery基础的工厂函数以及定时器的经典实例分析
May 20 Javascript
基于css3新属性transform及原生js实现鼠标拖动3d立方体旋转
Jun 12 Javascript
JavaScript之cookie技术详解
Nov 18 Javascript
JavaScript之Canvas_动力节点Java学院整理
Jul 04 Javascript
JS实现的检验身份证格式并输出出生日期,年龄,性别,出生地示例
May 17 Javascript
微信小程序模板消息推送的两种实现方式
Aug 27 Javascript
微信接入之获取用户头像的方法步骤
Sep 23 Javascript
Vue替代marquee标签超出宽度文字横向滚动效果
Dec 09 Javascript
vue 动态设置img的src地址无效,npm run build 后找不到文件的解决
Jul 26 Javascript
vue项目中使用rem,在入口文件添加内容操作
Nov 11 Javascript
vue项目中使用bpmn-自定义platter的示例代码
May 11 #Javascript
Vue实现图片轮播组件思路及实例解析
May 11 #Javascript
浅谈webpack构建工具配置和常用插件总结
May 11 #Javascript
只有 20 行的 JavaScript 模板引擎实例详解
May 11 #Javascript
ES6使用新特性Proxy实现的数据绑定功能实例
May 11 #Javascript
JavaScript异步操作的几种常见处理方法实例总结
May 11 #Javascript
Nuxt默认模板、默认布局和自定义错误页面的实现
May 11 #Javascript
You might like
PHP获取客户端真实IP地址的5种情况分析和实现代码
2014/07/08 PHP
php将access数据库转换到mysql数据库的方法
2014/12/24 PHP
PHP判断来访是搜索引擎蜘蛛还是普通用户的代码小结
2015/09/14 PHP
PHP遍历目录文件的常用方法小结
2017/02/03 PHP
在laravel框架中使用model层的方法
2019/10/08 PHP
TP3.2.3框架使用CKeditor编辑器在页面中上传图片的方法分析
2019/12/31 PHP
点击文章内容处弹出页面代码
2009/10/01 Javascript
JS在IE和FF下attachEvent,addEventListener学习笔记
2009/11/26 Javascript
JavaScript 布尔操作符解析  &amp;&amp; || !
2012/08/10 Javascript
jquery自定义属性(类型/属性值)
2013/05/21 Javascript
Javascript 字符串模板的简单实现
2016/02/13 Javascript
Javascript之Date对象详解
2016/06/07 Javascript
Vue.JS入门教程之自定义指令
2016/12/08 Javascript
基于JQuery和原生JavaScript实现网页定位导航特效
2017/04/03 jQuery
js实现城市级联菜单的2种方法
2017/06/23 Javascript
微信小程序 蓝牙的实现实例代码
2017/06/27 Javascript
在vue里面设置全局变量或数据的方法
2018/03/09 Javascript
jquery点击回车键实现登录效果并默认焦点的方法
2018/03/09 jQuery
详解如何用webpack4从零开始构建react开发环境
2019/01/27 Javascript
vue 中使用 watch 出现了如下的报错的原因分析
2019/05/21 Javascript
jQuery单页面文字搜索插件jquery.fullsearch.js的使用方法
2020/02/04 jQuery
在Vue中使用CSS3实现内容无缝滚动的示例代码
2020/11/27 Vue.js
Djang中静态文件配置方法
2015/07/30 Python
开源Web应用框架Django图文教程
2017/03/09 Python
Python2 Selenium元素定位的实现(8种)
2019/02/25 Python
布隆过滤器的概述及Python实现方法
2019/12/08 Python
Python打开文件、文件读写操作、with方式、文件常用函数实例分析
2020/01/07 Python
Python Opencv实现单目标检测的示例代码
2020/09/08 Python
详解CSS3中Media Queries的相关使用
2015/07/17 HTML / CSS
HTML5头部标签的一些常用信息小结
2016/10/23 HTML / CSS
波兰运动鞋网上商店:Distance.pl
2020/07/30 全球购物
2015年司机年终工作总结
2015/05/14 职场文书
2016高考冲刺决心书
2015/09/23 职场文书
化工生产实习心得体会
2016/01/22 职场文书
《小乌鸦爱妈妈》教学反思
2016/02/19 职场文书
2020年元旦晚会策划书模板
2019/12/30 职场文书