【问题标题】:Why downloaded file is not downloaded instead it is shown in browser?为什么下载的文件没有下载,而是显示在浏览器中?
【发布时间】: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 请求。

标签: php download


【解决方案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;

【讨论】:

  • 我应该将此行添加到我的代码中吗?还是替换一些现有的行?
  • 但至少现在它是用户友好的(它不会在浏览器中显示任何不可读的内容)。我想我还会添加一个下载链接,因为该链接仅在短时间内有效(然后该文件被后端的 cron 删除)。
【解决方案2】:

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

header('Content-type: ');

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

【讨论】:

  • 不。不工作。我的 Firefox 版本是 12.0。是不是太老了?我的意思是我从这个 Firefox 12.0 作为客户端测试代码。
  • 根据您的解释,我认为出现问题的客户端是在较旧的浏览器上。如果在正确定义 HTTP 标头后浏览器仍然没有下载文件,那么可能只是客户端处理它的方式有问题。
  • 不,我说的是旧操作系统(操作系统),而不是旧浏览器。那么,如果您说“客户处理它的方式有问题”,那可能是什么?是否由于旧操作系统而包含在内?如果是这样,我可能会转向从更现代的操作系统测试代码......无论如何,感谢您的输入,感谢任何输入试图解决我的问题。我很感激。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-18
  • 1970-01-01
  • 2014-07-16
  • 1970-01-01
  • 1970-01-01
  • 2021-07-31
相关资源
最近更新 更多