大多数浏览器在浏览器内显示PDF时,是否会发出多个HTTP请求?

13
当在浏览器中显示 PDF 文件时,大多数浏览器(IE、FF、Safari、Chrome和Opera)是否会对该文件进行多次 HTTP 请求?我正在解决与WebTrends Web Analytics软件集成的问题,PDF 相关的统计信息似乎不正确。支持告诉我,因为WebTrends解析Web服务器访问日志以确定流量、下载等,所以难以确定准确的PDF下载数量,因为:
当用户单击 PDF 并通过 Acrobat Reader 浏览器插件在用户的浏览器中打开 PDF 时,每个页面都逐个下载——这样做是为了节省带宽,如果用户只查看 50 页 PDF 的前两页,则只会下载前两页。

对我来说这听起来很可疑(如何才能通过 HTTP 请求仅提供二进制文件的一部分?)——我一直在搜索 Google,但没有找到任何相关结果。

明天我将尝试找到一些 IE 软件,以便可以观察到这种现象并进行进一步调查。

非常感谢您提供的任何信息和想法。


1
虽然不是答案,但是http协议支持通过content-range头部下载文件的部分内容。也许PDF使用它... 耸肩 - Will
2
我发现Fiddler在进行IP数据包嗅探方面非常方便。 - Nate C-K
请参阅RFC 2616,第3.12节 - Julian Reschke
4个回答

13

如果您的网站返回一个像这样的 HTTP 响应头:

Accept-Ranges: bytes

PDF阅读器在读取几KB文档后会关闭初始连接。然后,它会使用范围请求头请求所需的文档部分,例如:

Range: bytes=242107-244329, 8060-76128

一个执行此操作的URL示例是http://www.ovationguitars.com/img/OVmanual.pdf

如果您不返回“接受范围”标头,则PDF文档将在单个请求中下载(例如,http://manuals.info.apple.com/en/iphone_user_guide.pdf)。

您可以使用HttpWatch查看IE中PDF阅读器的行为。

**免责声明:此答案由HttpWatch制造商Simtec Limited发布**


非常有趣,谢谢!看起来这是可能的,但经过进一步调查(观察HTTP请求/响应),似乎Adobe Acrobat Reader插件不支持以这种方式创建请求(可能也不支持为服务PDF的Web应用程序发送任何合成请求字节范围)。 - empire29
我在Chrome中检查了iphone_user_guide.pdf(https://manuals.info.apple.com/MANUALS/1000/MA1565/en_US/iphone_user_guide.pdf),并且我得到了2个请求:第一个请求是正常的,第二个请求被取消了。 - Olivier Masseau
我今天仍然看到这种行为,而 Fiddler 显示没有涉及“接受范围”头。 - Glen Little
只是提醒一下 - 我尝试禁用Chrome的PDF查看器并使用PDF.js插件(这是FF使用的) - 但Chrome仍然会发出(然后取消)第二个请求... - zam6ak

2

截至2016年6月,Firefox和IE11只会发起一次调用。

如果没有Content-Disposition头,则Chrome会发起两次调用。当它缺失时,Chrome会发起两个GET请求,似乎会取消第二个请求,并在浏览器中显示PDF文件。服务器不知道第二个请求被取消了,因此会再次发送PDF文件。

当服务器发送该头信息时,Chrome只会发起一次调用并启动或保存文件。

Content-Disposition: attachment

(您还可以建议在用户保存文件时使用的文件名...)
Content-Disposition: attachment; filename=test.pdf

1
添加此标头确实可以防止第二次调用,但它也会导致Chrome像附件一样下载PDF文件,而不是立即在浏览器中打开它。 - kman
是的,我仍然认为这是一个错误,但这是绕过它的一种方法。 - Glen Little
2
问题出在Chrome的PDF插件上。使用Content-Disposition: attachment时,PDF插件不会被使用。这就是为什么没有错误的原因。更多细节请参见:https://bugs.chromium.org/p/chromium/issues/detail?id=587709 - Olivier Masseau

0
在我的测试中,如果启用了REST Console 4.0.2扩展程序,则Chrome会对PDF发出双重请求。禁用此扩展程序可以使Chrome按预期工作(仅一个请求)。
编辑:启用Instapaper扩展程序也会导致Chrome对PDF发出双重请求。

0

我的想法是你说得很对:你的插件不能(也不应该)将PDF文件拆分成请求。

我有一个Web应用程序,可以从请求(单个请求)中提供PDF文件并在插件中显示。它会显示整个PDF而不获取任何其他信息。

此外,如果你正在寻找HTTP嗅探器,可以尝试Fiddler。我在网站调试期间发现这很有用。


我使用公司官方“支持”的浏览器IE,结合最新的Adobe Acrobat阅读器插件,在HTTPWatch中检查了一下,发现它正在下载整个PDF文件。 在头部中没有看到任何关于字节范围的信息。 - empire29

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接