基于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 相关文章推荐
jQuery EasyUI API 中文文档 - ComboBox组合框
Oct 07 Javascript
jquery如何判断某元素是否具备指定的样式
Nov 05 Javascript
jquery.gridrotator实现响应式图片展示画廊效果
Jun 23 Javascript
分享10个优化代码的CSS和JavaScript工具
May 11 Javascript
JavaScript的Ext JS框架中的GridPanel组件使用指南
May 21 Javascript
Bootstrap 布局组件(全)
Jul 18 Javascript
JavaScript获取键盘按键的键码(参照表)
Jan 10 Javascript
JS图片延迟加载插件LazyImgv1.0用法分析【附demo源码下载】
Sep 04 Javascript
angular内置provider之$compileProvider详解
Sep 27 Javascript
使用D3.js+Vue实现一个简单的柱形图
Aug 05 Javascript
vue中的mescroll搜索运用及各种填坑处理
Oct 30 Javascript
js构造函数constructor和原型prototype原理与用法实例分析
Mar 02 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面向对象全攻略 (十二) 抽象方法和抽象类
2009/09/30 PHP
一篇有意思的技术文章php介绍篇
2010/10/26 PHP
php学习之运算符相关概念
2011/06/09 PHP
javascript 一些用法小结
2009/09/11 Javascript
JavaScript中如何通过arguments对象实现对象的重载
2014/05/12 Javascript
JavaScript中统计Textarea字数并提示还能输入的字符
2014/06/10 Javascript
jQuery多级弹出菜单插件ZoneMenu
2014/12/18 Javascript
JS表的模拟方法
2015/02/05 Javascript
JS+JSP通过img标签调用实现静态页面访问次数统计的方法
2015/12/14 Javascript
使用微信小程序开发前端【快速入门】
2016/12/05 Javascript
nodejs实现邮件发送服务实例分享
2017/03/29 NodeJs
使用mint-ui开发项目的一些心得(分享)
2017/09/07 Javascript
关于Vue中axios的封装实例详解
2019/10/20 Javascript
python交互式图形编程实例(一)
2017/11/17 Python
python+matplotlib实现礼盒柱状图实例代码
2018/01/16 Python
Python基于多线程操作数据库相关问题分析
2018/07/11 Python
详解Django模版中加载静态文件配置方法
2019/07/21 Python
PyTorch加载预训练模型实例(pretrained)
2020/01/17 Python
python虚拟环境模块venv使用及示例
2020/03/04 Python
Python气泡提示与标签的实现
2020/04/01 Python
python 实现&quot;神经衰弱&quot;翻牌游戏
2020/11/09 Python
希尔顿酒店官方网站:Hilton Hotels
2017/06/01 全球购物
阿迪达斯墨西哥官方网站:adidas墨西哥
2017/11/03 全球购物
英国最出名高街品牌:Forever Unique
2018/02/24 全球购物
PatPat阿根廷:妈妈们的购物平台
2019/05/30 全球购物
傲盾软件面试题
2015/08/17 面试题
教学评估实施方案
2014/03/16 职场文书
祖国在我心中演讲稿600字
2014/09/23 职场文书
副校长个人对照检查材料思想汇报
2014/10/04 职场文书
领导欢迎词致辞
2015/01/23 职场文书
行政前台岗位职责
2015/04/16 职场文书
施工安全保证书
2015/05/09 职场文书
南京南京观后感
2015/06/02 职场文书
亲情作文之母爱
2019/09/25 职场文书
创业计划书之家教中心
2019/09/25 职场文书
新手初学Java List 接口
2021/07/07 Java/Android