PHP从服务器上的目录下载MP3文件

时间:2017-04-14 18:47:35

标签: php download mp3

我正在尝试将MP3文件下载到位于服务器上名为“songs”的目录中的用户计算机上。我已经能够运行一个脚本,通过浏览器下载这些文件。但是,这些文件严格下载为.mp3扩展名的文本。我想从服务器下载这些文件是可播放的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);

}

&GT;

以下是我在txt文件中获得的结果示例。

建立数据库连接
01 1983年他喜欢Fly.mp3'&gt; 01 1983年他喜欢Fly.mp3

1 个答案:

答案 0 :(得分:1)

首先,header()应该在包含echoprint_r,任何html,开头标记之前的空格(例如<?php)的任何输出之前发送。参考 到the manual

其次,如果要将文件内容响应到浏览器,则脚本不应输出任何其他内容。除内容之外的任何输出都将被视为内容的一部分。除非您将其作为multipart发送,并且您的客户能够处理它。

所以,一个例子

<?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);