我有一个运行Apache的网站,其主要目的是提供大(10-30 Mb)的PDF文件。 我经常从用户那里收到电子邮件,说他们在下载文件时遇到了问题:
“将开始下载,但下载没有完成,冻结在25%左右。”
“似乎find了页面,只是旋转和旋转……我放了5分钟,没有数据,但是,当我select”下载“时,我在几秒钟内就收到了。
“它以某种方式开始在Chrome和Firefox上以10%左右的速度加载PDF。”
由于我不能重现这些问题,而且对绝大多数用户来说似乎也不是这样,所以很难弄清楚发生了什么事情。 据推测,用户错误configuration了浏览器或插件,或者在某些情况下,这是浏览器或插件的可用性问题。 让用户报告特定的错误信息或行为,描述他们的configuration等等,就像拉牙一样。
我已经看到了一些描述类似问题的其他问题,但是它们似乎是IIS特有的,而我运行的是Apache:
Acrobat 7停止从IIS 7下载PDF
使用Firefox / Chrome从服务器上下载PDF文件
这个错误似乎不符合我得到的(模糊的)报告:
是否有任何技术防弹我的设置,以便用户不会遇到这么多的这些问题? 在JavaScript中的浏览器检测与适当的消息? 警告用户针对特定的浏览器/插件组合,或自动检测这些组合? 现在,我甚至不能告诉我在apache日志文件中要查看哪些行,以查看服务器端是否logging了任何错误。 可能所有这些变得比您期望提供一个普通的旧静态文件更复杂,因为Adobe Reader试图变得棘手 – 尽pipe这些PDF没有被优化。
如果有人想尝试重现错误,用户报告问题的pdf文件在这里: http : //www.lightandmatter.com/sr/sr.pdf [现在可能不可能重现行为,因为我'已经实现了HåkanLindqvist的答案]
为了弄清楚是否有什么可以改进的地方,我想你会真的想找出这个问题发生的浏览器/ PDF查看器插件组合,并试图find一种方法来重现它。
在这个问题中提到了Chrome和Firefox,但至lessChrome自带了pdf查看器。 但是,使用Acrobat Reader插件或类似的浏览器是完全可能的,所以只要知道浏览器并不真正回答使用的软件。
另一方面,如果目标是让用户只需下载文件,而不想处理各种插件的怪异情况,则可以考虑指示浏览器不要打开文件,而只是下载它。
这可以通过在HTTP响应中设置Content-Disposition: attachment来完成。
当然,根据你的用户如何使用这些文件,这也可能导致混淆,但我想只是让浏览器保存一个文件,然后在本地打开它应该不太容易出错。
如果你可以复制这个,看看下载状态,请求和响应头,它会给你一个线索。
**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之后有一种炒作。
最初发布在这里 ,但一个可能(未经testing)的解决scheme是将以下添加到htaccess文件。
# Disable Byte-range for PDF files <Files *.pdf> Header set Accept-Ranges none </Files>