前言
新接到一个需求,需要在上传视频时,对视频的分辨率和时长做一个限制,如果不符合规范则无法上传。这个需求在前端和后端都可以完成,但为了用户体验,还是放在前端来完成比较好。
解决方案
经过调查,可以使用如下的方法来处理:拿到 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 放入指定的网页元素中然后渲染到页面上即可。