To force a file download in PHP, you can use the header()
function to send specific HTTP headers that tell the browser to treat the file as a download, rather than displaying it. The readfile()
function is then used to read the file and send it to the browser.
Here’s a basic example of how to force a file download with PHP:
1. Simple File Download Example
<?php
// Path to the file
$file = 'path/to/your/file.txt';
// Check if the file exists
if (file_exists($file)) {
// Set headers to force the file download
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="' . basename($file) . '"');
header('Content-Length: ' . filesize($file));
// Flush the system output buffer
flush();
// Read the file and output it to the browser
readfile($file);
exit; // Ensure no further code is executed
} else {
echo 'File not found!';
}
?>
Explanation of Code:
header('Content-Type: application/octet-stream')
: This tells the browser that the content is a binary file that should be downloaded.header('Content-Disposition: attachment; filename="..."')
: This header specifies that the file should be treated as an attachment and forces the browser to show the “Save As” dialog. Thefilename
part suggests a default name for the file.header('Content-Length: ' . filesize($file))
: This sends the size of the file to the browser. This is useful for the browser to show a progress bar and ensure the file is correctly downloaded.flush()
: This ensures that all buffered content is sent to the browser before starting the file download.readfile($file)
: This reads the file and sends it directly to the browser. It starts the actual download process.exit
: Ensures that no further PHP code is executed after the file download begins.
2. Additional Options
- Force Download for Specific File Types: You can modify the
Content-Type
header for specific types of files. For example, if you’re downloading a PDF, you can use:header('Content-Type: application/pdf');
- File Not Found Handling: Make sure to handle the scenario where the file does not exist or cannot be accessed (as shown in the code above with the
if (file_exists($file))
check). - Security Considerations: Always sanitize the file path and validate user input to prevent directory traversal attacks (i.e., trying to download files outside the intended directory).
Example for Multiple File Types
You can also force download for multiple file types by checking the file extension:
<?php
$file = 'path/to/your/file.pdf';
// Get the file extension
$ext = pathinfo($file, PATHINFO_EXTENSION);
// Set appropriate content type based on the file extension
switch ($ext) {
case 'pdf':
header('Content-Type: application/pdf');
break;
case 'jpg':
case 'jpeg':
header('Content-Type: image/jpeg');
break;
case 'png':
header('Content-Type: image/png');
break;
default:
header('Content-Type: application/octet-stream');
}
header('Content-Disposition: attachment; filename="' . basename($file) . '"');
header('Content-Length: ' . filesize($file));
flush();
readfile($file);
exit;
?>
Conclusion:
By setting the appropriate HTTP headers, you can force a file download in PHP. This method is commonly used for offering downloadable resources, reports, images, or other files to users. Just ensure that the file path is correctly validated to avoid security risks.