プログラミング言語や環境設定を中心としたパソコン関連の技術メモです。
主にシステム開発中に調べたことをメモしています。TIPS的な位置付けで、気が向いたときにちまちま更新していきます。
最新版のGoogle Chromeで、objectタグでインライン表示していたPDF(PHPから出力)が勝手にダウンロードされるようになったお話
結論から書くと、Content-Typeの解釈が変わった?っぽいですね。
あるいはobjectタグのtype属性を見なくなったのかな(--?

とにかく、今まで

Content-Type: application/octet-stream

で出力していたのを、きちんと

Content-Type: application/pdf

と指定するようにしたら、インライン表示されました。
う~む、よく分からん。

気を取り直して、詳細を書いていきます。

とあるHTMLファイルの中にこんな記述がありましてねφ(--)

<object data="output_pdf.php" type="application/pdf">

呼び出している「output_pdf.php」の中身は、こんなんでしたφ(--)

<php
header('Content-Type: application/octet-stream');
header('Content-Disposition: inline; filename="hoge.pdf"');
readfile("/hoge_dir/hoge.pdf");

処理はサーバ上のPDFファイル「hoge.pdf」を読み込んで、返しているだけです。

以前はこれで、objectタグを指定した画面上に「hoge.pdf」の中身が表示されていました。
ところがどっこい、ある時ふと気づいたら、勝手にダウンロードされるようになっていたのです。

あれ(--?

なんで(--?

「勝手に」の部分は設定を変えれば「保存しますか?」とか訊いてくるようにできるけど、
そもそもダウンロードじゃなくてインライン表示しろや!(;゚д゚)

ぷりぷりしながら試行錯誤した結果、Content-Typeの指定を

application/octet-stream

から

application/pdf

に変えたら無事にインライン表示されるようになりました。
PHPのコードで書くと、こんな感じですφ(--)

<php
//header('Content-Type: application/octet-stream');
header('Content-Type: application/pdf');
header('Content-Disposition: inline; filename="hoge.pdf"');
readfile("/hoge_dir/hoge.pdf");

昔のChromeさんは、気を利かせてファイルの種類を自己判断していたのでしょうか(--?
「application/octet-stream」(なんかのバイナリファイルだよ)を指定しても
拡張子あたりから「あぁ、PDFファイルか」と判断して、インライン表示してくれていたっぽいです。
実際のところは分かりませんが、事実、昔のChromeではインライン表示されていたので
そうなのでしょう。

それが変わったのかな(--?

うん。

挙動としたら今の方が正しいでしょうね。

……むしろ、なんで今までインライン表示されていたのよ?(--;

いろいろと腑に落ちない部分はありますが、気にしないことにします。

取りあえず、今までインライン表示していたPDFとかが
何も変更していないのに勝手にダウンロードされるようになった場合は、
Content-Typeの指定を疑ってみても良いと思いますよ。

そんな感じ\(--)/
スポンサーリンク
 
このエントリーをはてなブックマークに追加 

category:● その他 

  関連記事