I am attempting to download MP3 files to the user computer located in a directory named “songs” on the server. I have been able to run a script which downloads these files through the browser. However, these files download strictly as text with .mp3 extension. I want these files to be playable mp3 files upon downloading from the server.
Here is my PHP script.
<?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");}
//Script currently downloads a list of all songs found on server
$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);
}
?>
Here is an example of the result I get in a txt file.
Established Database Connection
01 In 1983 He Loved To Fly.mp3′>01 In 1983 He Loved To Fly.mp3
Advertisement
Answer
First, header()
should be sent before any output which includes echo
, print_r
, any html, a blank space before the opening tag(eg. <?php
). Refer
to the manual
Second, if you want to response with the content of a file to the browser, your script should not output anything else. Any output besides the content will be considered a part of the content. Unless you send it as multipart and your client is able to handle it.
So, an example
<?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
header("Content-Length: ".filesize($file));
readfile($file);