后台视频上传校验

1,974 阅读1分钟

最近后台有个需求,需要上传视频时校验视频的宽高,还得给服务端传时长,码率过去,没弄过呀,那赶紧百度吧,我用的是element-ui的up-load组件,先来看看常用的图片上传校验,一般在before-upload时校验上传文件:

function beforeAvatarUpload(file, width, height) {
const self = this
const isJPG = file.type === 'image/jpeg';
        const isLt2M = file.size / 1024 / 1024 < 2;

        if (!isJPG) {
          self.$message.error('上传头像图片只能是 JPG 格式!');
        }
        if (!isLt2M) {
          self.$message.error('上传头像图片大小不能超过 2MB!');
        }
        
  let isSize = new Promise(function(resolve, reject) {
     const url = URL.createObjectURL(file)
      let src = e.target.result
      const image = new Image()
      image.onload = function() {
        if (width && self.width / self.height !== width / height) {
          self.$message.error({
            title: '上传图片的宽高不符合要求,请重传',
          })
          reject()
        } else {
          resolve()
        }
      }
      image.onerror = reject()
      image.src = src
  })
  return isJPG && isLt2M && isSize;
}

思路就是加载一个图片标签,然后获取宽高, 注意return isJPG && isLt2M && isSize的顺序不能变哦,因为isSize是最后返回的一个Promise对象,需要根据它的状态来判断是否校验通过,如果放前面会直接转为true,校验就会失效。

视频校验如下:

function beforeAvatarUpload(file, width, height) {
const self = this
const isMP4 = file.type === 'video/mp4';
        const isLt20M = file.size / 1024 / 1024 < 20;

        if (!isMP4) {
          self.$message.error('上传视频只能是 MP4 格式!');
        }
        if (!isLt20M) {
          self.$message.error('上传视频大小不能超过 20MB!');
        }
        
  let isSize = new Promise(function(resolve, reject) {
    const url = URL.createObjectURL(file)
    const video = document.createElement('video')
    video.onloadedmetadata = evt => {
      // Revoke when you don't need the url any more to release any reference
      URL.revokeObjectURL(url)
      if (width && video.videoWidth / video.videoHeight !== width / height) {
        self.$message.error({
          title: '上传视频的宽高比例不符合要求,请重传',
        })
        reject()
      } else {
        resolve()
      }
    }
    video.src = url
    video.load() 
  }) 
   return isMP4 && isLt20M && isSize;
}

基本和图片一样,但是加载函数换成了onloadedmetadata,宽高换成了videoHeight和videoWidth。视频时长和码率都可以通过video标签拿到,但是直接console.log(video)是看不到的,需要使用console.log(evt)也就是事件参数查看。

但是还没完哦,过了几天,测试发现有视频死活上传不上去,校验无法通过,赶紧查看一下,发现js获取到的videoHeight和videoWidth都为0!看视频文件未发现任何异常。

经过几番查找才发现原因是这个文件的编码格式不是h264!,使用格式工厂转化一下就好。

关于h5的video标签还有很多不熟悉的地方,还需要多多学习才行~~