What code do you need to add in PHP to automatically have the browser download a file to the local machine when a link is visited?
I am specifically thinking of functionality similar to that of download sites that prompt the user to save a file to disk once you click on the name of the software?
Send the following headers before outputting the file:
header(\"Content-Disposition: attachment; filename=\\\"\" . basename($File) . \"\\\"\");
header(\"Content-Type: application/force-download\");
header(\"Content-Length: \" . filesize($File));
header(\"Connection: close\");
@grom: Interesting about the \'application/octet-stream\' MIME type. I wasn\'t aware of that, have always just used \'application/force-download\' :)
Here is an example of sending back a pdf.
header(\'Content-type: application/pdf\');
header(\'Content-Disposition: attachment; filename=\"\' . basename($filename) . \'\"\');
header(\'Content-Transfer-Encoding: binary\');
readfile($filename);
@Swish I didn\'t find application/force-download content type to do anything different (tested in IE and Firefox). Is there a reason for not sending back the actual MIME type?
Also in the PHP manual Hayley Watson posted:
If you wish to force a file to be downloaded and saved, instead of being rendered, remember that there is no such MIME type as \"application/force-download\". The correct type to use in this situation is \"application/octet-stream\", and using anything else is merely relying on the fact that clients are supposed to ignore unrecognised MIME types and use \"application/octet-stream\" instead (reference: Sections 4.1.4 and 4.5.1 of RFC 2046).
Also according IANA there is no registered application/force-download type.
A clean example.
<?php
header(\'Content-Type: application/download\');
header(\'Content-Disposition: attachment; filename=\"example.txt\"\');
header(\"Content-Length: \" . filesize(\"example.txt\"));
$fp = fopen(\"example.txt\", \"r\");
fpassthru($fp);
fclose($fp);
?>
my code works for txt,doc,docx,pdf,ppt,pptx,jpg,png,zip extensions and I think its better to use the actual MIME types explicitly.
$file_name = \"a.txt\";
// extracting the extension:
$ext = substr($file_name, strpos($file_name,\'.\')+1);
header(\'Content-disposition: attachment; filename=\'.$file_name);
if(strtolower($ext) == \"txt\")
{
header(\'Content-type: text/plain\'); // works for txt only
}
else
{
header(\'Content-type: application/\'.$ext); // works for all extensions except txt
}
readfile($decrypted_file_path);