【问题标题】:PDF download stalls in IE8IE8 中的 PDF 下载停止
【发布时间】:2013-11-29 22:18:08
【问题描述】:
我有一个问题,我完全不知道如何诊断和解决。我有一个包含一堆 PDF 的网站,应该在新选项卡/窗口中打开。但是,客户端在 IE8 中查看 PDF 时遇到问题 - 他们说下载在几百 KB 后停止。 PDF不是很大,不到10MB。
有问题的页面是:http://familyfoods.ca/flyer-download/。单击任何商店链接以下载 PDF。客户报告的 PDF 是 fffAA-1.pdf(可从 Bassano Family Foods 访问,Alberta 下的第一个链接)。
非常感谢任何帮助!
【问题讨论】:
标签:
pdf
internet-explorer-8
download
【解决方案1】:
这个问题已经在 stackoverflow 上被问过并回答了很多次,但是您的问题让我有机会发布在 16 小时的故障排除、猜测和谷歌搜索直到我的手指受伤后引起我注意的答案。
问题是 IE8 拒绝下载 PDF 文件或在浏览器中打开它们。有问题的站点是安全的(SSL 加密),并且文件正在使用 PHP 流式传输到 Web 根目录之外的位置。
基本上,您将看到的所有现有示例都指出了您应该发送到浏览器的各种标头,并且存在关于哪些是最好的以及哪些有效和无效的争论。您会看到一些 Microsoft 文章的链接,这些文章描述了影响 Internet Explorer 5-8 中缓存的错误等等,但我从未看到以下内容;
//Full working example code
session_cache_limiter('');
header('Content-Type: application/pdf');
header('Date: '.gmdate('D, d M Y H:i:s').' GMT');
header('Cache-Control: private,post-check=0,pre-check=0,max-age=1');
header('Pragma: public');
header('Expires: 0');
header('Content-Disposition: attachment; filename="'.basename($filename).'"; modification-date="'.$modified.'"; size='.filesize($filename).';');
header('Content-Length: '.filesize($filename));
header('Content-Transfer-Encoding: binary');
readfile($filename);
神奇的答案:session_cache_limiter
不明显的是 session_cache_limiter('');当您还使用会话时需要它,因为它会发送自己的缓存标头,如果您不知道这一点,或者至少注意了,那么它会从您身边溜走,IE8(Internet Explorer 8.0)将拒绝下载使用上述标头流式传输 PDF 文件。通过发出带有零长度字符串参数的函数来禁用会话系统发送的这些缓存标头,它允许您最终控制进入 IE 的标头,从而避免这种“陷阱”。