欢迎您来到,李雷博客 | PHP博客        登录  |  注册

blob:http 地址的原理及生成方法

更新:2024-03-21 10:51:46
人气:351
来源:互联网转载YM
A+

我们观看视频网站的时候,发现video标签中的src属性值为blob:http,并不是视频的链接地址。

blob是H5的Blob对象数据,具体请看文档,我们可以使用Blob对象隐藏真实的资源路径,在一定程度上可以起数据的加密作用,更多的是为了干扰爬虫。

比如日常使用的一些音频,视频,图片,我们都可以使用其 Blob 二进制数据流来表征数据,而非使用 url,就像经常用到的 image src 的 dataUrl。

要使用 blob 来表征数据资源,需做到以下两点:

服务端返回的为资源的二进制数据,前端接收到二进制数据后,使用 URL.createObjectURL(blobData) 方法将服务端返回的二进制数据转换为 blob 的 url 资源挂载到相应的资源对象

服务端blob.php

<?php

// 返回二进制流数据
$file_path = 'D:/phpstudy_pro/WWW/10003/naruto.mp4';// 文件地址
$file_size = filesize($file_path);// 文件大小

/*建议使用 file_get_contents() 读取文件内容,性能比 fread() 好*/
//$oct_data = fread(fopen($file_path, "r"), $file_size);// 读取文件内容
$oct_data = file_get_contents($file_path);// 读取文件内容

// 输出
header("Content-type: video/mpeg4;charset=UTF-8");
header("Content-Length: " . $file_size);
echo $oct_data;

前端 video.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 src="//cdn.bootcdn.net/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<script>
    $.ajax({
        type: "POST",
        url: '/blob.php',
        xhr: function() {
            let xhr = new XMLHttpRequest();
            xhr.responseType = 'blob';
            return xhr;
        },
        success: function(data) {
            $('#video').attr('src', URL.createObjectURL(data));
        },
        error: function() {
            alert('error');
        }
    });
</script>
</body>
</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', '/blob.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>

这样真是的视频资源静态地址就可以被隐藏掉了。

我们只是实例讲解下如何生成 blob 资源地址,生产中是很少会将一个资源以二进制流的方式返回给前端进行 Blob “加密”的,因为服务端需要将相应的资源打开读取,会消耗对应的内存,比如一个视频如果50M,那我们服务端返回其二进制数据时,就要消耗 50M 的服务器内存将文件载入,然后返回给前端,这代价略大,而且网络传输相应速度也不允许,如果返回个 500M 的二进制数据,估计就会有很大的卡顿了。

生产场景往往是对切片格式的视频 m3u8 地址进行 blob 格式处理,其实并不是为了加密,因为浏览器还是会解析 blob 并去 get 请求对应的 m3u8 地址,使用 blob url的好处在于可以在一定层度上干扰爬虫。

 

推荐的文章
# 发表我的评论
  /     /  
# 最近评论
暂时还没有评论,要不要说点什么?
  Ads by Google
  联系博主
Hello,本博客系统采用PHP和MySql开发,程序开发完全是因为个人爱好,是自己纯手写PHP源代码,未采用任何PHP框架!
QQ:858353007   微信号:lileihot123
网站地图
会员服务
关于我们
QQ:858353007
 
广告服务
加我微信
移动端访问
 
 
Copyright © 2014- 2024 www.mdaima.com All Rights Reserved.
李雷博客,专注PHP经验、PHP教程及PHP源代码开源下载分享的PHP博客!   ICP备案号:京ICP备10202169号-4