Freelance Web Designer East Sussex
PHP download link
All my tutorials are completely free of charge. If you found them useful and would like to make a donation towards the new tutorials, please click the button below.
In this tutorial I will show you how to create a link to a file which prompts the user for a download.
You can see the demo here.
To start with create two new files and call them download.php and index.php.
Open the download.php and remove the entire content which your editor added to it, then start typing the following:
<?php
// block any attempt to the filesystem
if (isset($_GET[‘file’]) && basename($_GET[‘file’]) == $_GET[‘file’]) {
$filename = $_GET[‘file’];
} else {
$filename = NULL;
}
First we are checking if the the url contains the parameter file and whether basename($_GET[‘file’]) and $_GET[‘file’] have the same value – this is to prevent any attackers from downloading files we don´t want them to download.
If the condition is true then we are assigning the value of the file to the variable called $filename, however if the condition is false then we are assigning NULL to the variable.
On the next line type:
// define error message
$err = ‘<p style="color:#990000">Sorry, the file you are requesting is unavailable.</p>’;
This line of code creates a new variable called $err and assigns the default message which will be displayed to the user when the file is unavailable or any other problem occur.
if (!$filename) {
// if variable $filename is NULL or false display the message
echo $err;
} else {
// define the path to your download folder plus assign the file name
$path = ‘downloads/’.$filename;
// check that file exists and is readable
if (file_exists($path) && is_readable($path)) {
// get the file size and send the http headers
$size = filesize($path);
header('Content-Type: application/octet-stream');
header('Content-Length: '.$size);
header('Content-Disposition: attachment; filename='.$filename);
header('Content-Transfer-Encoding: binary');
// open the file in binary read-only mode
// display the error messages if the file can´t be opened
$file = @ fopen($path, ‘rb’);
if ($file) {
// stream the file and exit the script when complete
fpassthru($file);
exit;
} else {
echo $err;
}
} else {
echo $err;
}
}
?>
What´s happening here is - first we check whether the $filename is NULL and if so we are displaying our message $err message. If it isn´t NULL then we are creating the variable called $path which stores the path to the file and assigns the populated name of the file to the end of it.
Next we are checking whether the file exists and is readable, if so then we are sending the appropriate http headers with file size and opening the file in binary read-only mode (rb). Then, if the file has been opened successfully, we are using the fpassthru() function to write the result to the output buffer.
If any of the condition was unsuccessfull we are displaying our $err message.
Now open index.php and type the following:
<a href="download.php?file=picture.jpg">Download file</a>
And that´s it there is to it.
You can download the final version of the download.php file here.