kazpgmの日記

『プログラム自動作成@自動生成』作成の日記

TOOL更新_ver0.1のimageDsp.php(秘密の場所にある画像表示)をzendframeworkに合わせてImagedspController.phpにした。

■TOOL更新_ver0.1のimageDsp.phpをzendframeworkに合わせてImagedspController.phpにした。秘密の場所にある画像をログインした人のみ見せる。・・・ログインしてない人には"Error loading "と書かれた画像を作って表示するもの。まだ実験中なのでコーディング規約には沿っていないけど、徐々に、このページを直接直していくことにする。

■ログインのロジックはコメントにしてある。・・・ログイン関連はまだ、考え中 <= ver0.1と同じロジックにしてPGMした。

■URL例:http://localhost/samples/kaz/com/imagedsp/index?user=user&fname=temptemptemp/20090909221914_4aa7ab5229f65/map.gif
 ・http://localhost/samples/kaz/com/imagedsp/index/fname/temptemptemp/20090909221914_4aa7ab5229f65/map.gifにしたところ.htaccessで.gifに反応してしまったので、これにした。これでzendframeworkできちんと動く。 補足:”/index”を抜かしても動く。

■実は、いまだになぜパラメータ(?と&を使う)形式よりURL形式(/で区切る)がいいと思っているのかわらない。・・・そのうちわかるだろうと思っているのだけど。すでに1年ぐらいたっている。<=4/28解決。http://d.hatena.ne.jp/kazpgm/20100428/1272472078参照

■秘密の場所はcommon.phpに”define('DIR_UPLOAD_SECRET', dirname(__FILE__) . '/upload/');と書いてある。

■画面例:このURLをWEBページのIMGタグに書けば、ログインした人のみ画像が見れるというもの。ログインしていない人は"Error loading "と書かれた画像になる。

■フォルダ

■userIndex.phpの$front->setControllerDirectoryを抜粋

    $front->setControllerDirectory(
        array(
            'default'  => APP.'/default',
            'com'  => APP.'/com'
        )
    );

■ImagedspController.phpのクラス構成

■ImagedspController.php
画像は”xxxx/xxxx/xxxx.gif”(<=例)ならOK。”./”はNGのチェックしている。 これは”テーブル名/主キー/項目名.拡張子”というファイル名を想定している。

<?php
//  =============================================================
//  2010 kaz PHP自動作成お助けTOOL.(http://kazpgm.ddo.jp/) Start
//  修正BSDライセンス。
//  =============================================================
// Controllerの基底クラス
require_once 'ControllerBase.php';

// Controller実装クラス
class Com_ImagedspController extends ControllerBase {

    protected function _commActSub() { // 親クラスでabstractメソッドにしてある。親クラスの_commAct()から呼ばれる。
        // このアクションでは自動レンダリングを行いません
        $this->_helper->viewRenderer->setNoRender();

        $okflg = true;
        $this->_o['fname'] = str_replace('\\', '/', $this->_o['fname']); // '\'を/に変更する。
        if (ereg("\.\/", $this->_o['fname'])) { // ./はエラーにする。
            $okflg = false;
        }
        if ($okflg && !ereg("^[0-9a-zA-Z_\-]+\/[0-9a-zA-Z_\-]+\/[0-9a-zA-Z_\-]+\.[0-9a-zA-Z_\-]+$", $this->_o['fname'])) { // ファイル名チェック。
            $okflg = false;
        }
        if ($okflg && !is_file(DIR_UPLOAD_SECRET . $this->_o['fname'])) { // ファイルがないときはエラーにする。
            $okflg = false;
        }
        $imgname = DIR_UPLOAD_SECRET . $this->_o['fname'];
        if ($okflg) {
            $okflg = false;
            if ($this->_o['user'] == 'user') {
                if (( '' == $this->_sess['u_login_id_login']) &&  // ユーザのログイン
                    ( $this->_sess['login_type'] != '1' && $this->_sess['login_type'] != '2' && $this->_sess['login_type'] != '3')) { // 管理者のログイン
                } else {
                    $okflg = true;
                }
            } else if ($this->_o['user'] == 'admin') {
                if( $this->_sess['login_type'] == '1' || $this->_sess['login_type'] == '2' || $this->_sess['login_type'] == '3'){ // 管理者のログイン
                    $okflg = true;
                }
            }
        }
        $path_parts = pathinfo($imgname);
        $ext = $path_parts['extension'];

        if ('jpeg' == $ext) {
            header("Content-type: image/jpeg");
            if ($okflg) $im = @imagecreatefromjpeg($imgname);
        } else if ('jpg' == $ext) {
            header("Content-type: image/jpeg");
            if ($okflg) $im = @imagecreatefromjpeg($imgname);
        } else if ('gif' == $ext) {
            header("Content-type: image/gif");
            if ($okflg) $im = @imagecreatefromgif($imgname);
        } else if ('png' == $ext) {
            header("Content-type: image/png");
            if ($okflg) $im = @imagecreatefrompng($imgname);
        }
        if ($okflg == false || !$im) { /* 失敗したかどうかを調べる */
            //$im = imagecreatetruecolor (10, 10); /* 空の画像を作成 */
            //$bgc = imagecolorallocate ($im, 255, 255, 255);
            //$tc = imagecolorallocate ($im, 0, 0, 0);
            //imagefilledrectangle ($im, 0, 0, 10, 10, $bgc);
            $im = imagecreatetruecolor (150, 30); /* 空の画像を作成 */
            $bgc = imagecolorallocate ($im, 255, 255, 255);
            $tc = imagecolorallocate ($im, 0, 0, 0);
            imagefilledrectangle ($im, 0, 0, 150, 30, $bgc);
            /* エラーメッセージを出力 */
            imagestring ($im, 1, 5, 5, "Error loading ", $tc);
        }

        imagejpeg($im);
        imagedestroy($im);
        if ($this->_getEndDebugFlg() == true) {
            $this->_logger->outDbgLog('[END] ///--------');
        }
        //exit;
    }

    // デバック出力設定を戻す。オーバーライトした。
    protected function _getDebugFlg() {
        return false;
    }

}
//  =============================================================
//  2010 kaz PHP自動作成お助けTOOL.(http://kazpgm.ddo.jp/) End
//  修正BSDライセンス。
//  =============================================================

■実際に使っている例です。(Ver0.1)
http://kazpgm.ddo.jp/kaz01u/を開いてログインする。


http://kazpgm.ddo.jp/kaz01u/item/itemU.php?mode=list

http://kazpgm.ddo.jp/kaz01u/item/itemU.php?mode=detail&item01=A0905050001 秘密の画像のところ


ログインしていない別ブラウザで、http://kazpgm.ddo.jp/kaz01u/imageDsp.php?fname=item/A0905050001/item51.jpg&user=user

==============================

追記1:この変更をやってみて、imageDsp.phpみたいなプログラムはWEBフォルダにおいてhtmlみたいな感じ(今までと同じ)で使ったほうがいいのでは、と思えてくる。zendframeworkにする必要はない。のだが.htaccessで「RewriteRule !\.(js|ico|gif|jpg|png|css|jpeg|html|avi|swf)$ userIndex.php」としているので。phpは全部zendframeworkのフォルダ構成に寄せておいたほうがいいのだろう。という考え。

追記2;ということで「ControllerABase.php」を「indexAction()、_outErrHtml($e, $priority)、_indexActionSub()、__call($method, $args)、_preDo() 」メソッドだけにして、それ以外のメソッドは「ControllerABaseExt.php」に移動した。http://d.hatena.ne.jp/kazpgm/20100121/1264095498を直接修正した。

追記3:そうだ、「ControllerAase.php」は「管理者用Controllerの基底クラス」として作ったものだった。「ユーザ、管理者共通の基底クラス」を作ってそれを使うように後で修正しよう。<=4/20 修正(後述参照)した。

4/14 20:00-02:50
4/14 7:30-8:00 あとで共通ログインクラスを作ってそれでチェックする予定。
4/20 22:00-23:00 // このアクションでは自動レンダリングを行いません $this->_helper->viewRenderer->setNoRender(); を追加して、//exit;にした。exit;でも同じ(この後処理ないので。だけど、せっかくsetNoRender()したのだから、自動レンダリングしないということを確認するために//exit;にした。)。
「ControllerABase.php」を「ControllerBase.php」にした。両phpともにhttp://d.hatena.ne.jp/kazpgm/20100121/1264095498を直接修正した。 デバックログを出す出さないを返すメソッドをつくった。(ImagedspController.phpのようなプログラムはデバックログなんて必要ないので。)ControllerBase の_getDebugFlg() をオーバーライトした。
4/21 2:02:30 実際に使っている例です。(Ver0.1)を追加した。
4/28 1:40-1:40 URL形式(/で区切る)を使う理由はなぜか。を解決した。
8/9 11:00-11:30 ログインチェックも入れた。
8/14 10:00-10:30 ImagedspController.phpのクラス構成を追加