前言
新接到一个需求,需要在上传视频时,对视频的分辨率和时长做一个限制,如果不符合规范则无法上传。这个需求在前端和后端都可以完成,但为了用户体验,还是放在前端来完成比较好。
解决方案
经过调查,可以使用如下的方法来处理:拿到 file对象 后,通过 URL.createObjectURL 将 file对象 转化为存放 blob 信息的 url。之后再创建一个 video实体Dom,然后通过 loadedmetadata 事件获取到视频的信息,该事件是异步的,所以封装成一个 Promise 处理,代码如下:
1 | new Promise(resolve => { |
其中有一个注意点,就是 URL.createObjectURL(new Blob([file])) 中的 file 必须是文件类型的对象,如下:

这个关键点卡了我很久,因为我传入的 file 经过了两层额外的封装,导致最终解析出的 url 如下,并非是 blob 信息:

正常的 url 内容如下:

最终获取到的视频信息如下:

实现上传前预览
要实现这个效果也很简单,只需要将上面一步中URL.createObjectURL(new Blob([file])) 生成的 图片/视频 Url 放入指定的网页元素中然后渲染到页面上即可。