Simple PHP File Download Script
So I recently added a download.php script to my website so that I could force downloads of files instead of having users access them through an indexed directory or through their browser.
I found various scripts online but none of them were as clean as I'd have liked them to be so I wrote my own simple script after a bit of research.
In my setup, the download.php file sits at the root of my website and the filevault folder sites one level higher on the web server. This setup ensures users cannot hotlink to files or directly access them, the script must be used. A benefit of this is that you can add restrictions like allowing a file to be accessed by people from a particular country or by those who have a certain cookie set. If you do not have access to the directory above your websites root directory then you are forced into putting your filevault at the websites root directory.
This is the simple PHP File download script:
<?php
/*
* Download File script
* Aurthor: Mo Beigi
* Url: https://mobeigi.com
* Usage: /download.php?file=XXXX
*
*/
ignore_user_abort(true);
set_time_limit(0); // disable the time limit for this script
if (!empty($_GET['file'])) {
$path_parts = pathinfo($_GET['file']);
$file_name = $path_parts['basename'];
$path_to_filevault_dir = "../filevault";
//Build absolute file path
$path_to_file = $path_to_filevault_dir . '/' . $file_name;
//Check if file exists
if (!file_exists($path_to_file)) {
print '<div>Invalid file specified. Please notify the webmaster if you think this is a mistake.</div>';
exit(1);
}
//Check if file is readable
if (!is_readable($path_to_file)) {
print "An error has occurred. Please notify the webmaster.";
exit(1);
}
# detect MIME type (http://stackoverflow.com/a/32092523/1800854)
$finfo = finfo_open(FILEINFO_MIME_TYPE);
header('Content-Type: ' . finfo_file($finfo, $path_to_file));
$finfo = finfo_open(FILEINFO_MIME_ENCODING);
header('Content-Transfer-Encoding: ' . finfo_file($finfo, $path_to_file));
header('Content-disposition: attachment; filename="' . basename($path_to_file) . '"');
readfile($path_to_file);
}
else {
print "'file' parameter is missing and is required.";
exit(1);
}
?>
Usage
The following link would force the download of that_file.txt
https://example.com/download.php?file=that_file.txt
Demo
You can also download the above script:
download.php