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


Why downloaded file is not downloaded instead it is shown in browser?

我将网站中的访问者从页面A重定向到页面B。在页面B中,我希望用户获得下载的PDF文件(在页面B加载时下载)。我从另一篇文章中获取了代码(请参阅此处回答的上一个问题),我的第 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 % 3 0 obj <>stream x MK1 o + $zIg& V=T =Xo K i+#V yx3 ඀(BX pW'

服务器:操作系统Linux;PHP 版本: 5.2.17

访客 -> 浏览器:火狐;操作系统: 视窗 2000

是否有可能由于客户端的旧操作系统而失败?如果没有,有没有人知道如何强制下载的解决方案?任何帮助将不胜感激。

谢谢。

尝试使用 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;
当首次

引入内容处置时,非常旧的浏览器中有一个怪癖,一些非常旧的浏览器不会显示"另存为"对话框,除非它无法识别您尝试打开的文件类型。尝试将内容类型设置为无(或无法识别的内容),看看这是否会强制旧浏览器弹出另存为对话框。

header('Content-type: ');

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