I have a script that takes a key from $_GET[\'key\'] , looks up the location in a database and uses the readfile together with some headers to present a download for the use
Never replace this: header("Content-type: application/octet-stream");
with this: header("Content-Type: application/force-download");
"application/octet-stream" is simply the most universal and works on most browsers.
I tried using "application/zip" in one of my tests since I was technically dealing with a ZIP file, but IE6.0 corrupted the download! Everything else behaved normally though. But yeah, had to switch back to "application/octet-stream" so any code out there that tries to detect the file extension, and switch to other content-types specific to the extension are risky! You're better off using "application/octet-stream" for ALL binary files!
To solve the error : "Internet Explorer cannot download download.php from www.example.com", Add these headers to your script:
header("Pragma: ");
header("Cache-Control: ");
The code will remove the Cache-Control from headers which makes the download problem.
The above code should be added at the top of the file.
It works fine for us.
Just a hint, if someone (like me) is facing problems with directly entering a filedownload into the address bar using a secured https-request. There is a IE bug that is causing this download to fail:
http://support.microsoft.com/kb/323308/en-us
Only workaround seems to be setting the cache-headers according to the article.
Replace this:
header("Content-type: application/octet-stream");
with this:
header("Content-Type: application/force-download");
According to this post, IE doesn't normally listen to your headers, and instead looks for itself what you are sending.
Managed to get this working by using the first example from php.net
http://us3.php.net/manual/en/function.readfile.php
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename($file));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
ob_clean();
flush();
readfile($file);
exit;