![能否防止因浏览器配置错误而导致下载大型 PDF?](https://linux22.com/image/635725/%E8%83%BD%E5%90%A6%E9%98%B2%E6%AD%A2%E5%9B%A0%E6%B5%8F%E8%A7%88%E5%99%A8%E9%85%8D%E7%BD%AE%E9%94%99%E8%AF%AF%E8%80%8C%E5%AF%BC%E8%87%B4%E4%B8%8B%E8%BD%BD%E5%A4%A7%E5%9E%8B%20PDF%EF%BC%9F.png)
我有一个运行 Apache 的网站,它的主要目的是提供大型 (10-30 Mb) pdf 文件。我经常收到用户的电子邮件,说他们在下载文件时遇到了问题:
“将开始下载,但下载未完成,在 25% 左右冻结。”
“它似乎找到了页面,但只是不停地旋转……我让它旋转了 5 分钟。没有数据。然而:当我选择“下载”时,我在几秒钟内就得到了它。”
“它以某种方式在 Chrome 和 Firefox 中以大约 10% 的速度开始加载 pdf。”
由于我无法重现这些问题,而且这些问题似乎不会发生在绝大多数用户身上,因此很难找出问题所在。大概是用户以某种方式错误配置了他们的浏览器或插件,或者在某些情况下,这可能是他们的浏览器或插件的可用性问题。让用户报告特定的错误消息或行为、描述他们的配置等,就像拔牙一样困难。
我见过一些描述类似问题的其他问题,但它们似乎特定于 IIS,而我正在运行 apache:
这个错误似乎与我收到的(模糊的)报告不符:
是否有任何技术可以确保我的设置万无一失,以便用户不会遇到这么多问题?使用 JavaScript 进行浏览器检测并显示相应消息?警告用户不要使用特定的浏览器/插件组合,还是自动检测这些组合?现在,我甚至不知道要查看 apache 日志文件中的哪些行才能查看服务器端是否记录了任何错误。所有这些可能都比您预期的提供普通静态文件的程序更复杂,因为 Adobe Reader 试图耍花招——尽管这些 PDF 并未优化。
如果有人想尝试重现该错误,这里有一个用户报告问题的 pdf:http://www.lightandmatter.com/sr/sr.pdf[现在可能无法重现该行为,因为我已经实施了 Håkan Lindqvist 的答案。]
答案1
为了弄清楚是否可以采取任何措施来改善此问题,我认为您确实想找出此问题发生在哪种浏览器/pdf 查看器插件组合上,并尝试找到重现它的方法。
问题中提到了 Chrome 和 Firefox,但至少 Chrome 有自己的 pdf 查看器。但是,完全可以在这两种浏览器中使用 Acrobat Reader 插件或类似插件,因此仅知道浏览器并不能真正回答所用软件的问题。
另一方面,如果目标是让用户简单地下载这些文件,并且您不想处理各种插件的奇怪问题,您可能需要考虑指示浏览器不要打开该文件而只是下载它。
Content-Disposition: attachment
这可以通过设置HTTP 响应来完成。
当然,根据您的用户如何使用这些文件,这也可能会造成混淆,但我想只需让您的浏览器保存一个文件然后在本地打开它就不太容易出错。
答案2
如果您可以复制此操作,请查看下载状态、请求和响应标头,它会给您提供线索。
**Response Headers**
Accept-Ranges bytes
Connection Keep-Alive
Content-Length 9531692
Content-Range bytes 11278-9542969/9542970
Content-Type application/pdf
Date Tue, 24 Jun 2014 21:08:45 GMT
Etag "1b78005-919d3a-4f550c11dff40"
Keep-Alive timeout=15, max=100
Last-Modified Mon, 24 Mar 2014 02:11:33 GMT
Server Apache/2.2.16 (Debian)
**Request Headers**
Accept text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding gzip, deflate
Accept-Language en-US,en;q=0.5
Connection keep-alive
Host www.lightandmatter.com
If-Range "1b78005-919d3a-4f550c11dff40"
Range bytes=11278-
User-Agent Mozilla/5.0 (Windows NT 6.2; WOW64; rv:30.0) Gecko/20100101 Firefox/30.0
下载状态 - 206 部分内容按照定义,这意味着“客户”提出了这个请求,而不是相反。
因此,在这种情况下,客户要求字节=11278-,响应头确认它正在接收接受范围。
有一件事确实令我感到困惑,那就是数字 8 后面有一个连字符。
最初发布这里,但一个可能的(未经测试的)解决方案是将以下内容添加到 htaccess 文件中。
# Disable Byte-range for PDF files
<Files *.pdf>
Header set Accept-Ranges none
</Files>