アシアルブログ

アシアルの中の人が技術と想いのたけをつづるブログです

PHPで表示したjpeg画像が、IEだとbmp画像でしか保存できない問題

こんにちは、牧野です。
先日、年明けに開かれる好きなアーティストのライブのチケットを買いました。
前のライブイベントはチケットが売り切れて残念でしたが、今回は大丈夫でした。
さらに、今度はものすごくいい席(前から4列目!)になったので、今からとても楽しみです。

さて。今日は久々にPHP関係のネタです。

前、PHPjpeg画像を出力して表示するプログラムを作ることがありました。
その時、IEでアクセスして、表示されたjpeg画像を保存しようとすると、何故かbmpと判断されるという問題が。。。次のは再現画像です。



プログラム自体はログインチェック後に読み込んだ画像を出力するようなシンプルなもので、Firefoxではちゃんとjpegと判断されます。
IEからjpeg画像ファイルに直接アクセスして表示した場合も大丈夫です。

最初、header関数でContent-Typeだけ出してContent-Lengthヘッダーを出していないのがいけないのかと思って、


header("Content-Length: ". filesize($imgpath) .";");

を追加しましたが、結果は変わりません。

Content-disposiionヘッダーも追加しましたが、それでも変わりません。


header("Content-disposition: inline; filename=\"test_image.jpg\"");




<img src="test_image.php">

のように、HTMLに書いたファイル名の拡張子がphpになっているのがいけないのかと思って


<img src="test_image.jpg">

にして、apachemod_rewriteでtest_image.jpgへのアクセスをtest_image.phpに行くようにしてみたけど、変わりません。。
IEのキャッシュがいけないのかと思ってキャッシュを全削除してみたけど、やっぱり変わりません。。。

同じようにPHPjpeg画像を出力するプログラムが他のサイトにあり、そちらはIEでもちゃんとjpeg画像だと判断していました。
となると、サーバから送られてくるヘッダー情報に何か違いがありそうです。
IEでヘッダー情報を見られるツールがないか調べてみると、ありました。

ieHTTPHeaders

FirefoxLive HTTP headersと同じ感じで使えて便利です。
これを使って、IEjpeg画像保存できる場合とできない場合のヘッダーを見ると、、、

jpeg保存できる場合


HTTP/1.1 200 OK
Date: Thu, 16 Oct 2008 06:52:02 GMT
Server: Apache/2.0.52 (CentOS)
X-Powered-By: PHP/4.3.9
Keep-Alive: timeout=15, max=98
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: image/jpeg


jpeg保存できない場合


HTTP/1.1 200 OK
Date: Wed, 15 Oct 2008 12:26:08 GMT
Server: Apache/2.0.52 (CentOS)
X-Powered-By: PHP/4.3.9
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Content-disposition: inline; filename="test_image.jpg"
Keep-Alive: timeout=15, max=12
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: image/jpeg


Cache-Control、Pragmaあたりが何となくあやしそうです。
プログラムでこんなヘッダーを出すような部分はないと思って調べたら、session_start()で出ていました。。

session_start()時、session.cache_limiterで指定されたキャッシュの制御方法が送信されます。そのデフォルトがnocacheになっているので、勝手にno-cacheのヘッダー情報が送られていた、ということでした。
画像表示プログラムの最初にsession_cache_limiter('private')を追加して、無事jpeg画像保存できるようになりました。

この問題は回避できましたが、ブラウザの挙動違いやバグ、何とかならないかなぁ。。

僕は普段Firefoxを使っていますが、Firefoxは特定のpdfファイルにアクセスした時、ストリーミングコンテンツのリンクをクリックして、Windows Media Playerが起動した時にWindows Media Playerもろとも固まることがよくあります。
IEIEで、特定のHTMLだと挙動がおかしくなったり、ひどい場合はページを表示しただけで落ちたことがありました。。。