3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

この記事誰得? 私しか得しないニッチな技術で記事投稿!
Qiita Engineer Festa20242024年7月17日まで開催中!

ブラウザでPDFダウンロードが失敗する原因は、Chromiumの仕様だった

Last updated at Posted at 2024-06-23

背景

ChromeやEdgeブラウザでいくつかのサイトを利用している際、PDFのダウンロードボタンをクリック時のエラーとなる事象に遭遇した。

image.png

↓日本語設定だと”インターネット接続をご確認ください”と表示されています。

image.png

Chromeのdevtoolでダウンロードボタン押下後の通信について、PDFダウンロードが成功するサイト、失敗するサイトの比較してみましたが、いずれも外部通信がボタン押下をトリガーとして実施されていなかったため、ブラウザの内部的な原因を疑い、Chromium Issue Trackerにissue登録をしてみた。

結論

私が切ったissueはこれ。
https://issues.chromium.org/issues/336965824

コメントの中で教えてもらったものは↓これ。
https://issues.chromium.org/issues/40293042

結論、本事象はChromiumの既知のissueでした。(10年前からのまだ検討中の様です。)

そのため、現時点での対応は下記ワークアラウンドを選択し、ブラウザ側で実施いただくorWEBサーバ管理側にcash設定を見直してもらう。となる。

本事象の再現条件

ブラウザの設定

ブラウザのPDFドキュメントデフォルトの動作がPDFビュワーで表示する設定になっている。
image.png

日本語設定だと、”ChroniumuでPDFを開く"となっているラジオボタンが選択されている状態。

WEBサーバ側の設定

PDFデータを返却するHTTPレスポンスヘッダにおいて、

  • Cache-Control: no-store
  • Content-Disposition: inline
    が返却されていること。

https://issues.chromium.org/issues/336965824
私が上記issueに添付した、sample.zipで本事象が再現できる環境を用意しました。
Dockerさえあれば、ローカルで動作すると思うので、この記事の読者の方で自分がはまっている状態と一致しているかは確認いただけると思います。

原因

以下の2つの仕様によりダウンロードが失敗している。

  • PDFビュワーのダウンロードボタン押下時は、ブラウザ内部で保有しているキャッシュをソースとして、ユーザ所定のローカルディレクトリへPDFファイルをエクスポートすることでダウンロードを実現している
  • WEBサーバ側からは、no-store(一切の保存を許さない)設定でPDFファイルがブラウザに到達しているため、PDFビュワーに表示後、キャッシュを破棄している

これら2点により、ダウンロード時に参照すべきキャッシュが存在しないため、エラーが発生している。

ワークアラウンドについて

ブラウザ側

  • PDFビュワーのダウンロードボタンではなく、印刷ボタンでPDF保存を選択する
  • ブラウザの設定をPDFダウンロードする設定に変える

WEBサーバ側

  • Cache-Controlヘッダをno-storeからno-cache 等に変更する※
    MDN Cache-Control

※ WEBサーバ側の変更の際は、キャッシュへの影響があるので、影響確認を実施した後に変更することを推奨いたします

Chromium側の対応方針について

https://issues.chromium.org/issues/40293042
上記のコメントを追っていくと、2012年から議論されているが

  • ダウンロードボタン押下した際に、再度通信を行う
  • 一時的にキャッシュを行う
    の2案があるように見える。

私としては、とりあえず、ネットワークエラーと表示される点の是正や、
ダウンロードボタン自体押下できないようにグレーアウトするなどのをしたらどうか?と下記コメントを自分のissueに残してみたが、今日時点で反応はない。(自分でコード書ければいいのだがスキル不足)

まとめ

Chromiumのissueを自分で初めて起票したけど、みんな優しく教えていただき感謝。
Dockerで再現環境も作成し提示できたのは議論を加速することができたと感じている。

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?