【发布时间】:2012-06-24 13:36:12
【问题描述】:
我将网站中的访问者从页面 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 %���� 3 0 obj 流 x���MK1�o�+�$zIg&�� V=T�=Xo����K��i+#V�yx3 ��(BX�pW`
服务器:操作系统 Linux; PHP版本:5.2.17
访问者 -> 浏览器:Firefox;操作系统:Windows 2000
是否可能由于客户端的旧操作系统而失败?如果没有,是否有人知道如何强制下载的解决方案?任何帮助将不胜感激。
谢谢。
【问题讨论】:
-
试试 readfile("/wp-content/nature.pdf");而不是 fopen 和 fpassthru
-
根据下载的大小,您可能希望使用
XSendFile(带有 modxsendfile 的 lighttpd 和 apache2 都支持)。然后,您将使用:header('XSendFile: /wp-content/nature.pdf');提供下载,而 XSendFile 将处理其余部分。 -
@Venu - 已经尝试过(测试用户“take”建议的代码时见下文)。谢谢。
-
@user268396:感谢您的建议,文件不大(大约 500kb)。如果适用,我的代码(包括 XSendFile)应该是什么样子?
-
您能否验证这些标头是否真的被发送?例如,通过使用
telnet或使用 Firefox 扩展 LiveHTTPHeaders 发出手动 HTTP 请求。