2017-04-14 141 views
0

我試圖將MP3文件下載到位於服務器上名爲「歌曲」目錄中的用戶計算機上。我已經能夠運行一個腳本,通過瀏覽器下載這些文件。但是,這些文件嚴格按照帶.mp3擴展名的文本進行下載。我希望這些文件是從服務器下載的可播放mp3文件。PHP從服務器上的目錄下載MP3文件

這是我的PHP腳本。

<?php 

$link = mysqli_connect("...","...","....","...") or die("Error ".mysqli_error($link)); 

if(mysqli_connect_errno()) 
{echo nl2br("Failed to connect to MySQL:". mysqli_connect_error() . "\n");} 
else 
{echo nl2br("Established Database Connection \n");} 

//當前的腳本下載所有歌曲列表上的服務器

$target = "songs/"; 


if ($handle = opendir($target)) { 
    while (false !== ($entry = readdir($handle))) { 
     if ($entry != "." && $entry != "..") { 
      echo $entry."'>".$entry."</a>\n"; 
     } 
    } 
    closedir($handle); 
} 


$file = basename($_GET['file']); 
$file = 'Songs_From_Server'.$file; 

if(!$file){ // file does not exist 
    die('file not found'); 
} else { 


    header("Cache-Control: private"); 
    header("Content-type: audio/mpeg3"); 
    header("Content-Transfer-Encoding: binary"); 
    header("Content-Disposition: attachment; filename=".basename($file)); 


    readfile($file); 

}發現

?>

下面是結果我得到的一個例子一個txt文件。

建立的數據庫連接
01在1983年他愛Fly.mp3' > 01。1983年他愛Fly.mp3

+0

什麼是正確的位置MP3文件? 'print $ file;'在調用'readfile($ file);'之前''。它說什麼? – user4035

+0

我已經嘗試在調用readfile之前打印$ file。下載返回相同的結果。看起來很奇怪。 @ user4035 – gsanchez

+0

MP3文件駐留在目標服務器上名爲「songs」的目錄中。 @ user4035 – gsanchez

回答

1

首先,header()應任何輸出,其中包括echoprint_r,任何之前發送html,開始標記之前的空格(例如,<?php)。其次,如果你想用瀏覽器的文件內容進行響應,你的腳本不應該輸出任何其他內容。除內容之外的任何輸出都將被視爲內容的一部分。除非您將它作爲多部分發送並且您的客戶端能夠處理它。

所以,一個例子

<?php 

$fileName = $_GET['file']; 
$path = '/directory/contains/mp3/'; 
$file = $path.$fileName 

if (!file_exists($file)) { 
    http_response_code(404); 
    die(); 
} 

header("Cache-Control: private"); 
header("Content-type: audio/mpeg3"); 
header("Content-Transfer-Encoding: binary"); 
header("Content-Disposition: attachment; filename=".$fileName); 
//So the browser can display the download progress correctly 
header("Content-Length: ".filesize($file); 

readfile($file);