为什么下载文件没有下载而是在浏览器中显示?

时间:2012-06-24 13:36:13

标签: php download

我将网站中的访问者从第A页重定向到第B页。在第B页中,我希望用户获取下载的PDF文件(在加载页面B时下载)。 我从另一篇文章中获取了代码(参见previous question answered here),我的第B页代码如下:

<?php
header('Content-Disposition: attachment; filename=nature.pdf');
header('Content-type: application/pdf'); 
$fn=fopen("/wp-content/nature.pdf","r");
fpassthru($fn);
?>

输出不是通过打开下载对话框,而是在浏览器中显示一些不可读的字符,如下所示(我刚刚在下面选了一个小样本):

  

%PDF-1.4% 30 obj&lt;&gt;流x MK1 o + $ zIg&amp; V=T =Xo K i+# Vyx3඀(BXpW`

服务器:OS Linux; PHP版本:5.2.17

访客 - &gt;浏览器:Firefox;操作系统:Windows 2000

由于客户端的旧操作系统可能会失败吗?如果没有,是否有人知道如何强制下载的解决方案?任何帮助都将受到高度赞赏。

感谢。

2 个答案:

答案 0 :(得分:1)

使用Content-Length标题尝试:

ob_clean(); ob_start();
header('Content-Disposition: attachment; filename=nature.pdf');
header('Content-type: application/pdf'); 
header ("Content-Length: ".filesize("/wp-content/nature.pdf"));
readfile("/wp-content/nature.pdf");
exit;

答案 1 :(得分:0)

在首次引入Content-disposition时,真正旧的浏览器中出现了一个怪癖,一些非常旧的浏览器不会显示“另存为”对话框,除非它无法识别您尝试的文件类型打开。尝试将内容类型设置为空(或无法识别的内容),并查看是否会强制旧浏览器弹出另存为对话框。

header('Content-type: ');

如果可行,那么我建议在运行该行之前添加一行PHP以检测它们是否在旧浏览器上,因为现代浏览器将使用该标头来确定该文件应该是什么程序打开了。

相关问题