基于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 Autocomplete 结合asp.net使用要点
Oct 29 Javascript
jquery中插件实现自动添加用户的具体代码
Nov 15 Javascript
js数值和和字符串进行转换时可以对不同进制进行操作
Mar 05 Javascript
Vue.JS入门教程之列表渲染
Dec 01 Javascript
vue日期组件 支持vue1.0和2.0
Jan 09 Javascript
关于jquery layui弹出层的使用方法
Apr 21 jQuery
小程序实现多选框功能
Oct 30 Javascript
使用electron制作满屏心特效的示例代码
Nov 27 Javascript
原生JS实现留言板功能
Feb 08 Javascript
JavaScript设计模式--简单工厂模式定义与应用案例详解
May 23 Javascript
Vue3.0的优化总结
Oct 16 Javascript
JavaScript实现前端倒计时效果
Feb 09 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中养成7个面向对象的好习惯
2010/07/17 PHP
Thinkphp事务操作实例(推荐)
2017/04/01 PHP
php usort 使用用户自定义的比较函数对二维数组中的值进行排序
2017/05/02 PHP
js wmp操作代码小结(音乐连播功能)
2008/11/08 Javascript
jQuery插件 tabBox实现代码
2010/02/09 Javascript
js 禁止选择功能实现代码(兼容IE/Firefox)
2010/04/23 Javascript
jQuery 获取对象 定位子对象
2010/05/31 Javascript
jqeury eval将字符串转换json的方法
2011/01/20 Javascript
jquery命令汇总,方便使用jquery的朋友
2012/06/26 Javascript
JavaScript中获取鼠标位置相关属性总结
2014/10/11 Javascript
javascript通过元素id和name直接取得元素的方法
2015/04/28 Javascript
js中获取时间new Date()的全面介绍
2016/06/20 Javascript
AngularJs分页插件使用详解
2018/06/30 Javascript
vue-router动态设置页面title的实例讲解
2018/08/30 Javascript
vue发送ajax请求详解
2018/10/09 Javascript
layui动态渲染生成左侧3级菜单的方法(根据后台返回数据)
2019/09/23 Javascript
Angular利用HTTP POST下载流文件的步骤记录
2020/07/26 Javascript
vue登录页实现使用cookie记住7天密码功能的方法
2021/02/18 Vue.js
写了个监控nginx进程的Python脚本
2012/05/10 Python
python 内置函数filter
2017/06/01 Python
Python 分享10个PyCharm技巧
2019/07/13 Python
Python udp网络程序实现发送、接收数据功能示例
2019/12/09 Python
python-xpath获取html文档的部分内容
2020/03/06 Python
Python 爬虫的原理
2020/07/30 Python
Django Auth用户认证组件实现代码
2020/10/13 Python
python实现MySQL指定表增量同步数据到clickhouse的脚本
2021/02/26 Python
毕业自我鉴定
2013/11/05 职场文书
求职简历中个人的自我评价
2013/12/25 职场文书
小学红领巾中秋节广播稿
2014/01/13 职场文书
八一建军节部队活动方案
2014/02/04 职场文书
亚运会口号
2014/06/20 职场文书
群众路线教育实践活动学习笔记
2014/11/05 职场文书
大学生年度个人总结
2015/02/15 职场文书
2019暑假阅读倡议书
2019/06/24 职场文书
Android开发实现极为简单的QQ登录页面
2022/04/24 Java/Android
kubernetes集群搭建Zabbix监控平台的详细过程
2022/07/07 Servers