下载不在IE中工作的文件的PHP脚本

下载不在IE中工作的文件的PHP脚本,php,http-headers,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'

我有一个脚本,它从$_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);
替换此:
标题(“内容类型:应用程序/八位字节流”)
有了这个:
标题(“内容类型:应用程序/强制下载”)


根据这一点,IE通常不会监听您的标题,而是自行查找您发送的内容。

通过使用php.net中的第一个示例,成功地实现了这一点

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

唯一的解决办法似乎是根据文章设置缓存头。

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

标题(“Pragma:”)

标题(“缓存控制:”)

该代码将从导致下载问题的标头中删除缓存控件

上述代码应添加到文件的顶部

它对我们很好。

永远不要取代它: 标题(“内容类型:应用程序/八位字节流”)

为此: 标题(“内容类型:应用程序/强制下载”)

“应用程序/八位字节流”是最通用的,适用于大多数浏览器


我在一次测试中尝试使用“application/zip”,因为我在技术上是在处理一个zip文件,但是IE6.0破坏了下载!不过,其他一切都表现正常。但是,是的,必须切换回“应用程序/八位字节流”,因此任何试图检测文件扩展名并切换到特定于扩展名的其他内容类型的代码都是有风险的!最好对所有二进制文件使用“应用程序/八位字节流”

将内容处置标题设置为“附件”,如(在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>

标题集内容处置附件

看看SQL注入和mysql\u real\u escape\u字符串。这段代码易受攻击。哦,上帝,是的,请使用mysql\u real\u escape\u string我对此不太了解,但它可能与$file中的文件扩展名有关如果你是说$key变量,那么是的,我已经在使用它了,只是不在上面的代码中。我以前已经尝试过,不幸的是,同样的错误,谢谢。
application/octet-stream
是用于下载数据的官方MIME媒体类型(请参阅RFC 2046)。非常感谢您从来自火星的外星bug中拯救了我的生命。。。我不知道我能做什么,但你的盔甲帮助我杀死了这只非常非常大的虫子。。。虫子死了。。。耶!!。。谢谢:-)我们反复讨论这个问题。尝试了这么多来自博客帖子等的建议。这就是修复它的方法!
<FilesMatch "\.(txt|pdf|csv|xls|xlsx|xlam|xlsb|xlsm|msg|doc|docx|mpg|jpg|png)">
   Header set Content-Disposition attachment
</FilesMatch>