2

我需要隐藏音频流的 url,所以我认为既然我有一个readfile();用于执行此操作的下载脚本,我可以这样做,但我不确定如何在 javascritpt 中操作它。事实上,我不知道,甚至不确定是否可以这样做。

到目前为止,我有一个由 javascript 访问的 PHP 文件,以便在单击播放按钮时从 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 也可以这样做来流式传输它吗?

4

1 回答 1

0

通过使用 readfile(),您所做的就是将 php 脚本放入 URL 以供下载。javascript Audio() 对象仍然获取该 URL(并且可能在它全部加载之前开始播放),就像它使用文件的直接 URL 一样。它不是在流式传输它。您只是隐藏文件的 url。

如果您想提供受限访问,那么这是一个很好的方法,但如果任何人仍然可以使用这个新 URL 下载,那么除了文件的实际位置之外,您没有保护任何内容。

另外,请记住为正确的 mime 类型设置标题,例如

header('Content-Type: audio/mpeg');
header('Content-Length: '.filesize($file_path));
readfile($file_path);

您可能还想设置缓存过期标头等。

于 2013-08-07T13:19:47.110 回答