我需要隐藏音频流的 url,所以我认为既然我有一个使用 readfile();
来执行此操作的下载脚本,我也可以这样做,但我没有确定如何在 javascript 中操作它。事实上,我不知道,甚至不确定是否可以这样做。
到目前为止,我有一个 PHP 文件,可以通过 javascript 访问该文件,以便在单击播放按钮时从 ID 获取轨道的 URL。
$T_ID = mysqli_real_escape_string($con, $_GET['t_id']);
$qry = "SELECT url FROM tracks WHERE T_ID = $T_ID";
$result = mysqli_query($con, $qry);
$row = mysqli_fetch_array($result);
$url = $row['url'];
$path_parts = pathinfo($url); //get path info
$file_name = $path_parts['basename']; //only include mp3 track just incase path added in there
$file_path = 'uploads/' . $file_name; //add path
echo $file_path;
javascript 仅使用其中的 url 来指定 new Audio();
。但是,任何知道打开控制台并查看网络选项卡的人都可以找到轨道的 URL 并下载它。这根本不是我想要的,也不是我的用户想要的。
我的初步想法是将 echo($file_path)
替换为 readfile($file_path)
但我知道它需要以某种方式在 javascript 中进行操作。如果 PHP 以二进制形式读取文件,那么 javascript 也可以这样做以流式传输它吗?
最佳答案
通过使用 readfile(),您所做的只是将 php 脚本放入 URL 以供下载。 javascript Audio() 对象仍然获取该 URL(并且可能在它全部加载之前开始播放),就像它使用文件的直接 url 一样。它不是流式传输它。您只是隐藏了文件的 URL。
如果您想提供受限访问,那么这是一个很好的方法,但如果任何人仍然可以使用这个新 URL 下载,那么您就没有保护任何东西,除了文件的实际位置。
此外,请记住为正确的 MIME 类型设置 header ,例如
header('Content-Type: audio/mpeg');
header('Content-Length: '.filesize($file_path));
readfile($file_path);
您可能还想设置缓存过期 header 等。
关于php - 使用 PHP readfile 隐藏流 URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18034682/