dari88's diary

これから趣味にするプログラミング/PHP/javascript/kohana/CMS/web design/

kohanaのテスト12-14・・・画像出力のHTTPヘッダーを正しいマナーにする

 27日の日記にて作成した、データベースに保存した画像データを出力するコードに気になる点がありました。新しいウインドウに画像のみを出力すると、文字化け画面になります。実際にどういう HTTP ヘッダーが流れているのか調査するために、firefox のプラグイン HttpFox を導入してみました。

 画像をデータベースに保存していると思われる Flicr が送ってくるヘッダーをお手本にしました。しかし、ヘッダーを正しくしただけではダメでした。ob_clean() と flush() なるコマンドが必要です。

 

画像出力用の正しい HTTP ヘッダー

・kohana/application/classes/controller/test12/mediaview.php の部分

            header('Content-type: ' . $content_type[$ext]);
            header('Content-Disposition: filename="'.$org_name.'"');
            header("Accept-Ranges: bytes");
            header("Content-Length: ".strlen($img));
            ob_clean();
            flush();
            print $img;

  PHPマニュアルの header() のサンプルコードにはいろいろ書いてあります.。2行目のファイル名の送出はおまけです。これがあると、表示画像を保存する時に原画のファイル名がデフォルトになるので親切です。他の3行は必要十分条件です。そして、ob_clean() と flush()  で出力バッファーを綺麗にしてからバイナリーデータを送り出します。これをやらないと、image/jpeg を指定しているのに text/html で送られてしまいます。何で?・・・ってのは分からないんですけどね。

 とにかくこれでどういう使い方をしても文字化け画面は出なくなりました。

 

注1)ファイル名を送っている部分ですが、漢字のファイル名の場合ブラウザによっては文字化けします。ブラウザ個別対応を始めると泥沼状態に陥りますから、使わないほうが無難だと思います。