当我转到PDF文件的某些地址时,Chrome浏览器下载PDF,而不是使用其内置的PDF查看器打开它。然后页面变为空白白色。
我的Chrome设置没有问题:我尝试其他PDF文件的地址,并且Chrome的行为与预期相同(我将其设置为使用Chrome的内置PDF查看器)。但是每次我尝试相同的有问题的地址时,Chrome浏览器都会下载PDF,然后显示空白页面。
我正在使用Windows 10和Chrome浏览器。
Version 63.0.3239.84 (Official Build) (64-bit)
。这次我的特定问题网址在这里(Google搜索结果)。
#1 楼
基本上,发生这种情况是因为网站指示浏览器执行此操作。有时是因为网站开发者决定他们想要这种行为,例如在文件共享网站上常见。有时是因为这是他们使用的任何软件(例如论坛或博客软件)的默认选项。有时是因为站点开发人员不知道他们在做什么。Content-Disposition
通常是因为站点在响应中发送了
Content-Disposition
标头。具体来说,它可以发送inline
或attachment
。如果没有另外指定,则默认为
inline
,这意味着浏览器将在可能的情况下在浏览器窗口中打开文件。attachment
表示始终下载文件,从不尝试在浏览器中打开文件。如果打开浏览器的开发人员工具,您将看到特定的链接发送以下信息响应头:
Content-Disposition: attachment; filename="Schubert-Sonata-21-B-flat.pdf"
Content-Type: application/pdf
这告诉浏览器始终下载(
attachment
)文件,并为其提供默认文件名Schubert-Sonata-21-B-flat.pdf
,而不是从URL进行推断。此外,它确实告诉浏览器(正确)它是application/pdf
文件-但由于它是attachment
,因此浏览器仍默认为下载。内联处理详细信息
当
Content-Disposition
内联(或未指定)时,浏览器将尝试在默认的嵌入式查看器中打开文件。仅当浏览器知道文件类型是什么,并且浏览器知道如何打开该文件类型时,此方法才起作用。类型检测
服务器可以指定文件类型带有
Content-Type
标头。例如,最常见的内联类型是text/html
,application/javascript
和text/css
,它们构成了现代网站的三个主要部分。您还可以具有更多深奥的类型,例如application/pdf
。另一种可能性是服务器已将
Content-Type
指定为application/octet-stream
。这是最通用的类型,它告诉浏览器文件只是任意数据-这时浏览器唯一可以做的就是下载它(理论上,我们会做到这一点)。当服务器未指定
Content-Type
时(有时甚至未指定),浏览器可以执行嗅探来尝试通过读取文件并查找模式来猜测类型。类型处理
在接收到带有
inline
或未指定配置的文件后,浏览器需要在可能的情况下尝试在浏览器中打开它。为此,它将查看文件类型,如果识别出该文件类型,它将尝试将其打开。大多数浏览器会在简单的文本查看器中打开任何text/
类型,尝试将text/html
呈现为网页,并可能在突出显示语法的特殊查看器中打开application/json
,等等。application/octet-stream
类型是经过特殊处理的。因为它应该是最通用的类型,表示任意字节流,所以不应该有任何处理程序可以应用于此“类型”的所有文件。例如,在Firefox中,这表现为无法为application/octet-stream
设置默认处理程序。一些网站还使用了非标准类型。我看过使用过
application/force-download
的情况-最终作为下载内容,因为浏览器无法识别或不知道与该类型有关的其他内容,但是却不享受application/octet-stream
的特殊处理。一些历史课程
要了解如何处理PDF,我们可以深入研究Web历史。过去,浏览器不知道什么是PDF。因此他们无法打开它。但是,我们已经看到,在内置PDF查看器出现之前很久就已经在浏览器中打开了PDF,这是如何工作的?
与过去使用有限的扩展程序/扩展程序相比,过去可以用更多的控制权扩展浏览器功能。那些通常被称为插件。在Internet Explorer中,它们是ActiveX控件。在Mozilla Firefox和更高版本的Google Chrome中,它们是NPAPI插件。这些插件能够执行任何其他程序可以做的所有事情,并且可以将自己注册为特定文件类型的处理程序,否则浏览器将无法识别它们。 (顺便说一句,后来发现这存在巨大的安全风险,并且逐渐放弃了对这些强大插件的支持...)
在插件时代,您将去安装Adobe Acrobat Reader,然后会安装一个ActiveX或NPAPI插件,该插件将注册
application/pdf
MIME类型,并告诉浏览器使用该插件内联打开这些类型。当然,在由这些原因引起的许多安全性和性能问题之后插件,主要的浏览器供应商决定合并自己的PDF查看器,同时逐步淘汰对大多数插件的支持。我们仍然看到的唯一一个是Adobe Shockwave Flash,它可以处理
application/x-shockwave-flash
。实际上仍然有一些剩余控件,例如在Firefox中,
Preview in Firefox
选项仍然存在:这些日子也早于HTML5附带的许多媒体支持之前。不仅是PDF,您的浏览器也不知道如何处理MP4容器或H.264视频,也不知道如何播放MP3文件等。您将看到VLC等媒体播放器提供的插件甚至Windows Media Player,或者网站会嵌入Flash内置的媒体播放器。
#2 楼
我找到了一个解释。根据我发现的答案,如果MIME内容类型未设置为application/pdf
,而是设置为“错误或通用MIME类型” application/octet-stream
,那么Chrome似乎将下载PDF。此外,“大多数Web服务器使用默认的
application/octet-stream
MIME类型发送未知类型的资源。出于安全原因,大多数浏览器不允许为此类资源设置自定义默认操作,从而迫使用户将其存储到磁盘上以进行使用。“ 评论
确实-此逻辑会覆盖内容的配置,因此很重要。
–轨道轻赛
17年12月17日下午14:56
@LightnessRacesinOrbit它并没有太多覆盖配置,因为它为浏览器提供了一种类型,除了保存到磁盘之外,它无法执行任何其他操作(禁止嗅探)。当然,可见效果是相同的。
–鲍勃
17/12/18在1:09
@Bob:好的,这是一个合理的解释
–轨道轻赛
17年12月21日在11:18
#3 楼
这是由于HTTPContent-Disposition
标头指定该文件为附件。这指示浏览器下载文件,而不是直接打开文件。有一个Chrome加载项可以替代此行为。下图来自Firefox开发人员工具:
评论
请问是否还有类似的Firefox插件?
– davyjones
17年12月17日在17:37
@davyjones您可以。这样您不必询问是否有Firefox附加组件,这里是一个。
– wizzwizz4
17 Dec 17 '20:16
该插件似乎不再起作用
– Paul Slocum
18年3月18日在12:09
此其他扩展程序似乎可以正常使用:chrome.google.com/webstore/detail/no-pdf-download/…
– eddyb
19年12月10日在16:49
评论
有时,当服务器设置Content-Type:application / octet-stream时,也会发生这种情况,但是现在这种情况已经不那么普遍了。
–迈克尔·汉普顿
17年12月17日在21:14
之所以使用值“ inline”和“ attachment”,是因为Content-Disposition最初是为MIME电子邮件指定的,这些值更合适:)
–霍布斯
17年12月18日在22:59
@hobbs:当一些更抽象的东西可以做时,几乎是可重用技术中特定领域术语的案例研究
–轨道轻赛
17年12月21日在11:18