内藤 裕二/ 2021年 1月 13日/ 技術

久しぶりのブログ投稿になります。内藤です。
ちょっと理解浅いので、記述が正確でない場合はご指摘ください。

TL;DR

  • WebアプリでPDFをブラウザ(Chrome)で表示したあと、ダウンロードしようとすると設定したファイル名でダウンロードできなかった
  • content-disposition: inline; filename="~"で指定したファイル名は、cache-control: no-store指定していると効かなくなる

起きた現象

サーバサイドでPDF作成し、ブラウザ上で表示させる機能を実装しました(content-disposition: inline; filename="~")。
ブラウザ上でPDF表示されるのですが、Chromeからダウンロードしようとすると、content-dispositionで指定したファイル名でなく、「ダウンロード」という名前でダウンロードしようとします。

Chromeダウンロード.jpeg

Chromeダウンロード2.jpeg

原因

セキュリティ観点から、cache-control: no-storeを指定していました。
これはブラウザ側でレスポンスをキャッシュに保存しないようにする指示です。
ところで、ダウンロード時のファイル名は、現象の説明に記載したように、レスポンスヘッダに記載しています。
従って、cache-control: no-store指定されると、ブラウザ側でダウンロード時のファイル名を保持できなくなります。

対処

content-disposition: inline指定されているページでだけ、cache-control: no-store を設定しないように変更しました。

参考資料