ethnaで画像ファイルをDBに登録して表示

色々はまったからメモ代わりに記載する。

DBに登録

基本的にはここに書いてあるコードっぽくやれば登録できる。ただし、DB登録にethnaのDBオブジェクトを使用して登録しようとする場合には注意が必要。ethnaフレームワークが頭がいいから、addslashes()関数を使用してエスケープシーケンスを行った後に登録している。なので、二重にやると画像ファイルが壊れてしまうためにaddslashes()を行ってはならない。

画像の表示

画像表示用のactionファイルを作成して、アクセスするほうがきれいだと思う。keyとなるidを渡してそれを表示するだけのimgageとかいうアクションを作成するとうまくいく。表示方法にSmartyのテンプレートを使用するのは非常に馬鹿らしい。なので、actionファイルのperform関数でprint関数を使用して表示してしまったほうがよい。具体的には以下のようなコード

<?php
    function perform()
    {
        $db =& new Estate_DB($this->backend->getDB());

        $id = $this->af->get('id');
        // 画像ファイルの取得
        $photo =$db->db_get($id);

        // ヘッダー情報の付与。これをやらないとブラウザがわからない。
        mb_http_output("pass");
        header("Content-type:" . $photo['type']);
        header("Content-Disposition: inline; filename=" . $photo['file_name']);

        // 画像データの表示
        print $photo['bin'];

        return;
    }
?>

っで、読み込み側はソースとしてそのデータを読み込む感じ。

まとめ

エスケープシーケンスをデフォルトでやっているのにはまった。。。よく考えるとフレームワークなんだからそれぐらいやってて当然だよなぁ...orz
それのせいで4時間ぐらい考え込むことになったし・・・。もうちょっと詳細な方法がほしい人は、なんかコメントにでも書いてくださいな。