ChromeでPDFを開く代わりにダウンロードすることがあるのはなぜですか?[複製]


125

PDFファイルの特定のアドレスに移動すると、Chromeは組み込みのPDFビューアーを使用してPDFを開くのではなく、PDFをダウンロードします。ページは空白の白になります。

Chromeの設定に問題はありません。他のPDFファイルのアドレスを試すと、Chromeは期待どおりに動作します(Chromeの組み込みPDFビューアーを使用するように設定しています)。しかし、同じ問題のあるアドレスを試すたびに、ChromeはPDFをダウンロードしてから空白のページを表示します。

Windows 10とChromeを使用しています Version 63.0.3239.84 (Official Build) (64-bit)

今回の問題のある特定のURLはここ(Google検索結果)です。

回答:


159

基本的に、これはWebサイトがブラウザに実行するように指示するために発生します。時々、それはウェブサイトの開発者が彼らがこの振る舞いを望むと決めるからです。例えば、ファイル共有サイトで一般的です。また、使用しているソフトウェア(フォーラムやブログソフトウェアなど)のデフォルトオプションである場合もあります。時々、それはサイト開発者が彼らが何をしているかわからないからです。


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/htmlapplication/javascriptおよびtext/cssで、最新のWebサイトの3つの主要部分を構成しています。のようなより難解なタイプを持つこともできapplication/pdfます。

別の可能性は、サーバーがを指定したことContent-Typeですapplication/octet-stream。これは最も一般的なタイプであり、ファイルが任意のデータであることをブラウザに伝えます-その時点でブラウザができることはそれをダウンロードすることだけです(理論的には-それに到達します)。

Content-Typeサーバーによってa が指定されていない場合(場合によっては指定されている場合でも)、ブラウザーはファイルを読み込んでパターンを探すことでタイプを推測しようとするスニッフィングを実行できます。

タイプ処理

inline処理が指定されていない、または指定されていないファイルを受信すると、ブラウザは、可能であればブラウザ内でそのファイルを開こうとする必要があります。これを行うには、ファイルの種類を調べ、その種類を認識すると、ファイルを開こうとします。ほとんどのブラウザーはtext/、単純なテキストビューアーで任意のタイプを開きtext/html、Webページとしてレンダリングしようとします。また、構文が強調application/jsonれた特別なビューアーなどで開きます。

タイプapplication/octet-streamは特別に処理されました。これは、バイトの任意のストリームを示す最も一般的なタイプであると想定されているため、この「タイプ」のすべてのファイルに適用できるハンドラーは想定されていません。例えば、Firefoxでは、これはデフォルトのハンドラを設定することができないとして現れるためにapplication/octet-stream

一部のWebサイトでは、非標準タイプも使用されています。私は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/pdfMIMEタイプを登録して、ブラウザーにプラグインを使用してこれらのタイプをインラインで開くように指示します。

もちろん、これらのプラグインに起因するセキュリティおよびパフォーマンスの問題が多数発生した後、主要なブラウザーベンダーは、ほとんどのプラグインのサポートを段階的に廃止しながら、独自のPDFビューアーを組み込むことを決定しました。まだ表示されているのは、Adobe Shockwave Flashのみapplication/x-shockwave-flashです。

実際には、このためにまだいくつかのコントロールが残っています。たとえば、FirefoxにはPreview in Firefoxオプションがまだ存在します。

オプションのスクリーンショット

以前は、これにより、そのタイプを登録した複数のプラグインから選択できました。たとえば、Flashの登録済みタイプのリスト:

登録済みタイプのスクリーンショット

当時は、HTML5に付属する多くのメディアサポートの前でもありました。PDFだけではありませんでした。ブラウザには、MP4コンテナやH.264ビデオの処理方法、MP3ファイルの再生方法などがわかりません。VLCなどのメディアプレーヤーが提供するプラグインが表示されます。または、Windows Media Player、またはWebサイトにFlashに組み込まれたメディアプレーヤーを埋め込むこともできます。


サーバーが設定されContent-Type: application/octet-streamたときにも発生することがありますが、最近ではそれほど一般的ではありません。
マイケルハンプトン

2
値「インライン」と「添付」が使用される理由は、Content-DispositionがもともとMIME電子メール用に指定されていたためです。これらの値の方がはるかに適切です:)
hobbs

@hobbs:より抽象的な何かが行われる場合の再利用可能な技術のドメイン固有の用語のほとんどのケーススタディ^ _ ^
OrbitのLightness Races

23

説明を見つけました。私が見つけ回答によると、MIMEコンテンツタイプがapplication/pdf「不正または汎用MIMEタイプ」に設定されている場合、ChromeはPDFをダウンロードするようapplication/octet-streamです。

さらに、「ほとんどのWebサーバーは、デフォルトのapplication/octet-streamMIMEタイプを使用して未知のタイプのリソースを送信します。セキュリティ上の理由から、ほとんどのブラウザーは、そのようなリソースのカスタムデフォルトアクションの設定を許可せず、ユーザーが使用するためにディスクに保存することを強制します。」


3
確かに-このロジックはコンテンツの性質をオーバーライドするため、覚えておくことが重要です。
軌道上の明るさのレース

@LightnessRacesinOrbitそれは、ディスクに保存する以外に(スニッフィングを除いて)何もできないタイプをブラウザに与えるので、ディスポジションをそれほどオーバーライドしません。確かに、目に見える効果は同じです。
ボブ

@ボブ:オーケー、それは公平な解釈です
オービットの

20

これは、ファイルが添付ファイルであることを指定するHTTP Content-Dispositionヘッダーが原因です。これは、ファイルを直接開くのではなく、ダウンロードするようブラウザに指示します。

この動作をオーバーライドできるChromeアドオンがあります。次の画像は、Firefox開発者ツールのものです。

Firefox開発ツールに見られるHTTPリクエスト


同様のFirefoxアドオンもありますか?
デイビー・ジョーンズ

3
@davyjonesかもしれません。Firefoxアドオンがあるかどうかを尋ねる必要がないように、ここにあります。
wizzwizz4

1
そのプラグインはもう機能していないようです
Paul Slocum
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.