用于下载文件的PHP脚本在IE中不起作用

时间:2009-08-02 13:44:18

标签: php http-headers

我有一个脚本从$ _GET ['key']获取一个键,查找数据库中的位置并使用readfile和一些标题来提供下载供使用。这适用于Firefox而不是IE8,无法在另一个IE上测试它。我在IE中收到以下错误:“Internet Explorer无法从www.example.com下载download.php”。好像是在尝试下载PHP脚本。


$the_query = "SELECT * FROM `files` WHERE `user_id`=" . $_SESSION['user_id'] . " AND `key`='" . $key . "'";

$result = mysql_query($the_query);
$row = mysql_fetch_array($result);

$file = '/var/www/vhosts/www.example.com/httpsdocs/uploads/' . $row['id'] . '/' . $row['file'];

header("Content-type: application/octet-stream");
header("Content-length: ".filesize($file));
header('Content-Description: File Transfer');
header("Cache-control: private");
header('Content-Disposition: attachment; filename=' . rawurlencode(basename($file)));
readfile($file);

6 个答案:

答案 0 :(得分:28)

解决错误:“Internet Explorer无法从www.example.com下载download.php”, 将这些标题添加到您的脚本中:

header("Pragma: ");

header("Cache-Control: ");

代码将从标题中删除Cache-Control,这会导致下载问题。

上面的代码应该添加在文件的顶部。

它适用于我们。

答案 1 :(得分:8)

通过使用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;

答案 2 :(得分:3)

替换它:
header("Content-type: application/octet-stream");
用这个:
header("Content-Type: application/force-download");

根据此post,IE通常不会收听您的标题,而是查找您要发送的内容。

答案 3 :(得分:1)

将 Content-Disposition 标头设置为“附件”,就像这样(在 PHP 中):附件被编写成脚本的位置。

header('Content-Disposition: attachment');

并在 .htaccess 中添加以下内容并添加您想要下载的任何扩展名,而不仅仅是 txt

<FilesMatch "\.(txt|pdf|csv|xls|xlsx|xlam|xlsb|xlsm|msg|doc|docx|mpg|jpg|png)">
   Header set Content-Disposition attachment
</FilesMatch>

答案 4 :(得分:0)

只是提示,如果某人(像我一样)在使用安全的https请求直接将文件下载输入地址栏时遇到问题。有一个IE错误导致此下载失败:

http://support.microsoft.com/kb/323308/en-us

根据文章,只有解决方法似乎是设置缓存标题。

答案 5 :(得分:0)

永远不要替换它: 标题(&#34;内容类型:application / octet-stream&#34;);

用这个: 标题(&#34;内容类型:application / force-download&#34;);

&#34;应用程序/八位字节流&#34;是最普遍的,适用于大多数浏览器。

我尝试使用&#34; application / zip&#34;在我的一个测试中,因为我在技术上处理ZIP文件,但IE6.0损坏了下载!其他一切都表现正常。但是,是的,不得不切换回&#34; application / octet-stream&#34;所以任何试图检测文件扩展名的代码,并切换到特定于扩展名的其他内容类型都是有风险的!你最好使用&#34; application / octet-stream&#34;对于所有二进制文件!