【发布时间】:2019-04-21 23:24:52
【问题描述】:
我们的软件(主要用于学校)和防火墙存在很多问题:我们在资源范围内使用 mp3,而 mp3 在许多学校防火墙中被阻止。我正在尝试编写一些 js 代码来检测何时发生这种情况,因此我们可以提醒用户(教师)与他们的 IT 部门交谈并解除阻塞。
我最初尝试播放一段无声的短mp3,并检测是否发生了这种情况。但是,你必须跳这么多圈才能自动播放音频,尤其是在 iOS Safari 上 - 等待用户交互等,以至于跳圈的东西只是妨碍了测试,并使代码认为 mp3 是当它们实际上只是被浏览器而不是网络阻止播放时被阻止。
所以,我放弃了播放 mp3 的想法。我想做的是通过网络请求一个小的 mp3 文件,然后分析响应的内容,以确保它实际上是一个 mp3 文件,而不是一个 html 页面,上面写着“对不起,那个内容被阻止”,或者当有人请求被阻止的文件时防火墙可能返回的任何其他内容。
我实际上想不出最简单的方法是什么,它可以跨浏览器工作。我正在使用 jQuery,我认为我可以在 jQuery ajax 调用的“成功”块中做一些事情,分析我返回的数据,检查它是否是一个 mp3 文件。
我想到的第一件事就是将数据拉到页面上的一个 div 中,如下所示:
var url = "/assets/test_media_files/silence.mp3?t="+Math.random();
$("#content-test-file-data").load(url, function(){
console.log("loaded data");
});
这是有效的,我在#content-test-file-data div 中有大量二进制数据乱码。但是,我怎么知道这是否是一个 mp3 文件呢?有没有更好的方法来做到这一点?我是否需要请求具有 mime 类型或类似类型的数据?谢谢
【问题讨论】:
-
您是否尝试过使用小测试文件创建和预加载
<audio>元素并在其上使用错误处理程序? -
@charlietfl 是的,这就是真正浪费时间的原因,尝试使用音频标签。我无法分辨浏览器阻止和网络阻止之间的区别。
-
@gaetanoM 看起来很有趣,谢谢。我会担心,因为该测试使用 HEAD 请求,可能存在 HEAD 请求可以通过防火墙的情况,而 GET 会被阻止。如果是这样,那么 HEAD 请求就不是一个好的测试。
-
你是对的,但另一种可能性是寻找 ....magic 标志(文件类型).....
标签: javascript jquery ajax mp3 binaryfiles