I have a script that gets a url for an mp3 track based on the ID sent via a GET variable in the url. The script then forces a download of this url. The problem i'm having is that the track is not found.
$url = $row['url'];
$file_name = $row['track_name'] .' - '. $row['artist_name'];
$path_parts = pathinfo($url); //get path info
$base_url = $path_parts['basename']; //only include mp3 track just incase path added in there
$file_path = '../uploads/' . $base_url;
if (file_exists($file_path)) {
header('Content-Description: File Transfer');
header('Content-Type: audio/mpeg');
header("Content-Transfer-Encoding: Binary");
header("Content-disposition: attachment; filename=\"".$file_name."\"");
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: ' . filesize($file_path));
ob_clean();
flush();
readfile($file_path);
exit;
}
else {
echo 'File not found.';
echo '<br/>';
echo $file_path;
}
What is show is something like this;
File not found.
../uploads/demo_4.wav
I have tried putting the full url as $file_path
, so http://localhost/upload/ ...
but the same thing happens.
If i enter the URL directly the file is there so i'm not exactly sure what is going on.
If you are running the script outside of the root folder, you want to use the relative path, try:
$file_path = './uploads/' . $base_url;
If you are running the script in the root folder and simply want to access a subfolder, try:
$file_path = 'uploads/' . $base_url;
If the image's path is root_folder/uploads/filename, try the following
$file_path = $_SERVER["DOCUMENT_ROOT"] . "/uploads/" . filename;
The point of the answer is this: rather than using relative paths, use the absolute path to the file, where everything up till the root folder is referenced by $_SERVER["DOCUMENT_ROOT"].
Hope the explanation is clear and the answer helps.