<!DOCTYPE html><html lang="en"><head>  <meta charset="UTF-8">  <meta http-equiv="X-UA-Compatible" content="IE=edge">  <meta name="viewport" content="width=device-width, initial-scale=1.0">  <title>上传视频</title>  <style>    #bar-warp {      width: 500px;      height: 30px;      border: 1px solid green;    }    #bar {      width: 0px;      height: 30px;      background: green;    }  </style></head><body>  <div id="bar-warp">    <div id="bar"></div>  </div>  <span id="precent"></span>  <br />  <input type="file" onchange="changeFile(event)" />  <script>    async function changeFile(e) {      let files = e.target.files      // await checkSize(files,true--> 为音频是应用 默认为false), '返回值、外面有 (尺寸宽 --- 分辨率) 尺寸高 视频时长 1 示意1秒   尺寸比例 [16,9]';       let checkSizes      if (files[0].type == "audio/mpeg") {        checkSizes = await checkSize(files, true)      } else if (files[0].type == "video/mp4") {        checkSizes = await checkSize(files)      }      if (checkSizes.duration > 300) {        console.log('视频上传工夫不能大于5分钟')        return      }      if (checkSizes.videoWidth != 1280 && checkSizes.videoHeight <= 720) {        console.log('只能视频上分辨率为720')        return      }      if (checkSizes.ccbl.join(':') != '16:9') {        console.log('上传尺寸为16:9的视频')        return      }      var pic = files[0]      var fd = new FormData();      var xhr = new XMLHttpRequest();      // 这里写接口      xhr.open('post', 'aa', true);      xhr.onreadystatechange = function () {        //readystate为4示意申请已实现并就绪        if (this.readyState == 4) {          document.getElementById('precent').innerHTML = this.responseText;          //在进度条下方插入百分比        }      }      xhr.upload.onprogress = function (ev) {        //如果ev.lengthComputable为true就能够开始计算上传进度        //上传进度 = 100* ev.loaded/ev.total        if (ev.lengthComputable) {          var precent = 100 * ev.loaded / ev.total;          console.log(precent);          //更改进度条,及百分比          document.getElementById('bar').style.width = precent + '%';          document.getElementById('precent').innerHTML = Math.floor(precent) + '%';        }      }      fd.append('pic', pic);      xhr.send(fd);    }    // 获取最大公约数    function getGcd(a, b) {      let n1, n2;      if (a > b) {        n1 = a;        n2 = b;      } else {        n1 = b;        n2 = a;      }      let remainder = n1 % n2;      if (remainder === 0) {        return n2;      } else {        return getGcd(n2, remainder)      }    }    // 创立虚构dom 并且放回对应的值    let checkSize = async (files, isVideo) => {      if (!files || !files[0]) return false      const checktimevideo = document.getElementById('checktimevideo')      if (checktimevideo) {        document.body.removeChild(checktimevideo)      }      let doms      if (!isVideo) {        doms = document.createElement('video')      } else {        doms = document.createElement('audio')      }      const url = URL.createObjectURL(files[0])      console.log(url)      doms.src = url      doms.id = 'checktimevideo'      doms.style.display = 'none'      document.body.appendChild(doms)      return await gettime(doms);    }    let gettime = (doms) => {      // 因为loadedmetadata 是异步代码所以须要promise进行封装转换为同步代码执行      const promise = new Promise(resolve => {        doms.addEventListener('loadedmetadata', e => {          const gcd = getGcd(e.target.videoWidth, e.target.videoHeight);          console.log(gcd)          let obj = {            videoWidth: doms.videoWidth, // 尺寸宽 --- 分辨率            videoHeight: doms.videoHeight, // 尺寸高            duration: e.target.duration, // 视频时长 1示意一秒            ccbl: [e.target.videoWidth / gcd, e.target.videoHeight / gcd] // 计算尺寸比例          }          resolve(obj)        })      })      return promise    }  </script></body></html>