The PHP way – see below this one for a better way
In a client work, I need to force download a MP4 file on some special occasions.
PHP was the solution – in my case -.
This is the small script that I’v placed in download.php – the important stuff -.
Before I have a file_exist condition and other stuffs… but this is the RAW material!
header ("Content-type: octet/stream");
header ("Content-disposition: attachment; filename=".$filename.".mp4;");
header("Content-Length: ".filesize($myFile));
ob_clean();
readfile($myFile);
Some of the MP4 files were beeing downloaded! Other weren’t. sh*t!
The problem was a PHP Fatal error!
[03-May-2014 08:09:18] PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 429363201 bytes) in /web/sites/user/domain.com/download.php on line 30
Well!, there are 3 ways to solve this.
- Edit php.ini and increase the max memory size.
- Add the following line to the PHP file…
ini_set('memory_limit','128M');
- Or add the following line to
.htaccess
php_value memory_limit 128M
First solution is the best option, since the other 2 might not work due to security settings.
The PHP way *ultimate solution*
This solution we don’t need to increase PHP memory limit.
This will read 8kb of file and push it to the client AND not the full file!
header ("Content-type: octet/stream");
header ("Content-disposition: attachment; filename=".$filename.".mp4;");
header("Content-Length: ".filesize($myFile));
ob_clean();
$handle=fopen($_REQUEST['file'], 'rb');
while (!feof($handle))
{
echo fread($handle, 8192);
flush();
}
fclose($handle);
The .htaccess way
The normal file type for MP4 is video/mp4.
This way the browser will try to play it and won’t download it.
We can force .htaccess to change it and force the download.
Lets say that we want to force the download when the URL has a ?dl.
RewriteCond %{QUERY_STRING} dl
RewriteRule .*\.mp4 - [T=application/octet-stream]
This way .htaccess
www.domain.com/video.mp4?dl and change the file type to application/octet-stream
– the one that forces the download.