2013-08-03 82 views
2

我需要隱藏的音頻流的URL,所以我想,既然我有一個使用readfile();做這樣的下載腳本,我可以做同樣的,但我不知道怎麼樣在javascritpt中操縱這個。事實上,我不知道,甚至不確定是否可以這樣做。使用PHP READFILE躲流URL

到目前爲止,我有一個是由JavaScript訪問從一個ID獲得軌道的網址被點擊播放按鈕時,一個PHP文件。

$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用於指定new Audio();。但是,任何知道顯示打開控制檯並查看網絡選項卡的人都可以找到該軌道的URL並下載它。這不是我想要的或我的用戶想要的。

我的初步想法是用readfile($file_path)替換echo($file_path),但我知道它會以某種方式需要在JavaScript中操作。如果PHP將該文件讀取爲二進制文件,那麼JavaScript是否也可以這樣做來傳輸它?

+0

什麼需要通過JavaScript操作?這是沒有意義的。 – Brad

+2

與問題無關:您的代碼有SQL注入問題。考慮消毒'$ T_ID',通過執行類似'$ T_ID = INTVAL($ T_ID)'(如果它是一個小的整數)或更改SQL查詢來' 「SELECT ... WHERE T_ID = \」 $ T_ID \ 「」 '。 – JiminP

+0

@JiminP:他已經在使用'mysqli_real_escape_string()'來清理這個值.. –

回答

0

通過使用ReadFile的(),你正在做的是使PHP腳本到的URL下載。 javascript Audio()對象仍然會獲取該URL(也可能在它全部加載之前開始播放),就像它直接鏈接到該文件一樣。這不是流式傳輸。你只是隱藏文件的網址。

如果你想提供訪問限制,那麼這就是做這件事的好方法,但如果有人仍然可以下載使用這個新的URL,那麼你就沒有保護任何東西,除了文件的實際位置。

此外,請記住設置標頭正確的MIME類型,例如

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

你也可以設置緩存過期頭,等