我们观看视频网站的时候,发现video
标签中的src
属性值为blob:http
,并不是视频的链接地址。
blob
是H5的Blob
对象数据,具体请看文档,我们可以使用Blob
对象隐藏真实的资源路径,在一定程度上可以起数据的加密作用,更多的是为了干扰爬虫。
比如日常使用的一些音频,视频,图片,我们都可以使用其 Blob
二进制数据流来表征数据,而非使用 uri
,就像经常用到的 image
src
的 dataUrl
。
要使用 blob 来表征数据资源,需做到以下两点:
- 服务端返回的为资源的二进制数据
- 前端接收到二进制数据后,使用 URL.createObjectURL(blobData) 方法将服务端返回的二进制数据转换为
blob
的url
资源挂载到相应的资源对象
实例:
对 video.mp4
资源加密,不使用静态 url
进行加载,使用 blob
url
进行加密。
服务端 blob.php
1 |
|
前端 video.html
源生写法
1 |
|
JQuery ajax写法
1 |
|
效果
1 | <video id="video" width="400" controls="controls" src="blob:http://localhost/a55765bd-d3e8-4a05-a424-aea7b4ff6cc7"></video> |
这样真是的视频资源静态地址就可以被隐藏掉了。
我们只是实例讲解下如何生成 blob 资源地址,生产中是很少会将一个资源以二进制流的方式返回给前端进行 Blob “加密”的,因为服务端需要将相应的资源打开读取,会消耗对应的内存,比如一个视频如果50M,那我们服务端返回其二进制数据时,就要消耗 50M 的服务器内存将文件载入,然后返回给前端,这代价略大,而且网络传输相应速度也不允许,如果返回个 500M 的二进制数据,估计就会有很大的卡顿了。
生产场景往往是对切片格式的视频 m3u8 地址进行 blob 格式处理,其实并不是为了加密,因为浏览器还是会解析 blob 并去 get 请求对应的 m3u8 地址,使用 blob uri 的好处在于可以在一定层度上干扰爬虫。