blob 其实是 h5 表征的 Blob 对象数据, 具体请看文档。我们可以使用 Blob 对象隐藏真实的资源路径, 在一定程度上可以起到数据的加密性, 更多的是为了干扰爬虫。
比如日常使用的一些音频, 视频, 图片, 我们都可以使用其 Blob 二进制数据流来表征数据, 而非使用 uri,就像经常用到的 image src 的 dataUrl。
要使用 blob 来表征数据资源, 需做到以下两点:
1、服务端返回的为资源的二进制数据
2、前端接收到二进制数据后, 使用 URL.createObjectURL(blobData) 方法将服务端返回的二进制数据转换为 blob 的 url 资源挂载到相应的资源对象。
实例
对 video.mp4 资源加密, 不使用静态 url 进行加载, 使用 blob url 进行加密。
服务端 index.php
<?php
// 返回二进制流数据
$file_path = __DIR__ . '/video.mp4';
$file_size = filesize($file_path);
$oct_data = fread(fopen($file_path, "r"), $filesize);
header("Content-type: video/mpeg4;charset=UTF-8");
header("Content-Length: " . $filesize);
echo $oct_data;
前端 index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Blob Url</title>
</head>
<body>
<video id="video" width="400" controls="controls"></video>
<script type="text/javascript">
//创建XMLHttpRequest对象
var xhr = new XMLHttpRequest();
//配置请求方式、请求地址以及是否同步
xhr.open('POST', '/index.php', true);
//设置请求结果类型为blob
xhr.responseType = 'blob';
//请求成功回调函数
xhr.onload = function(e) {
if (this.status == 200) {//请求成功
//获取blob对象
var blob = this.response;
//获取blob对象地址,并把值赋给容器
document.getElementById("video").src = URL.createObjectURL(blob);
}
};
xhr.send();
</script>
</body>
</html>
这样真是的视频资源静态地址就可以被隐藏掉了。
var blob = new Blob("保存为blob形式的数据");
var url = new URL.createObjectURL(blob);
可以被img等标签使用, 例如:image.src = url;