kazpgmの日記

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

TOOL更新_ver0.1のflDld.php(秘密の場所にあるファイルダウンロード)をzendframework に合わせてFldldController.phpにした。

■TOOL更新_ver0.1のflDld.phpをzendframeworkに合わせてFldldController.phpにした。秘密の場所にあるファイルをログインした人のみダウンロードできる。・・・ログインしてない人には"Please login"を表示するもの。まだ実験中なのでコーディング規約には沿っていないけど、徐々に、このページを直接直していくことにする。
これは、ログインした人が見れるWEBページに貼り付けるダウンロードのURLである。なので、ログインチェックを行う。かつ、URLで見れないフォルダにあるファイルをダウンロードできるようにしている。

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

■URL例:http://localhost/samples/kaz/com/fldld?user=user&fname=logininfo/admin01/topdesign.jpg

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

■画面例:このURLをWEBページに書けば、ログインした人のみダウンロードできるというもの。ログインしていない人は"Please login"と表示される。"Please login"はログイン画面(まだ考え中)へ飛ばす予定。<=備忘録

■フォルダ

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

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

■FldldController.phpのクラス構成

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

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

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

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

        $this->_o['fname'] = str_replace('\\', '/', $this->_o['fname']); // '\'を/に変更する。
        if (ereg("\.\/", $this->_o['fname'])) { // ./はエラーにする。
            exit('faild file name. 01');
        }
        if (!ereg("^[0-9a-zA-Z_\-]+\/[0-9a-zA-Z_\-]+\/[0-9a-zA-Z_\-]+\.[0-9a-zA-Z_\-]+$", $this->_o['fname'])) { // ファイル名チェック。
            exit('faild file name. 02');
        }
        if (!is_file(DIR_UPLOAD_SECRET . $this->_o['fname'])) { // ファイルがないときはエラーにする。
            exit('faild file name. 03');
        }
        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')) { // 管理者のログイン
                $this->_sess['req_url'] = $_SERVER["REQUEST_URI"];
                $this->_sessObj->array = $this->_sess;
                $this->_redirect('index');
            }
        } else if ($this->_o['user'] == 'admin') {
            if( $this->_sess['login_type'] != '1' && $this->_sess['login_type'] != '2' && $this->_sess['login_type'] != '3'){ // 管理者のログイン
                $this->_sess['req_url'] = $_SERVER["REQUEST_URI"];
                $this->_sessObj->array = $this->_sess;
                $this->_redirect('index');
            }
        } else {
            exit("Please login");
        }

        $handle = fopen(DIR_UPLOAD_SECRET . $this->_o['fname'], "rb");
        if ( !$handle ) {
            exit('faild file name. 04');
        }
        $flen = filesize(DIR_UPLOAD_SECRET . $this->_o['fname']);
        $path_parts = pathinfo(DIR_UPLOAD_SECRET . $this->_o['fname']);

        header("Content-Disposition: attachment; filename=" . $path_parts['basename']);
        header("Content-Type: application/octet-stream");
        header("Cache-Control: public");
        header("Pragma: public");
        header('Content-Length: ' . $flen);
        while(!feof($handle)) {
            set_time_limit(0); // スクリプト実行の最大秒数。0:時間制限なし
            print(fread($handle, 1024*8));
            ob_flush();       // PHPの出力バッファを強制出力します。
            flush();          // Webサーバの出力バッファを強制出力します。
        }

        fclose($handle);
        if ($this->_getEndDebugFlg() == true) {
            $this->_logger->outDbgLog('[END] ///--------');
        }
    }

    // デバック出力設定を戻す。オーバーライトした。
    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/flDld.php?fname=item/A0905050001/item52.pdf&user=user(秘密ファイルのダウンロード)とすると「http://kazpgm.ddo.jp/kaz01u/index.php」にリダイレクトしている。

==============================
4/21 22:30-03:00 ファイルサイズが大きくてもダウンロードできる。
8/9 11:30-11:40 ログインチェックを追加した。
8/14 10:20-10:30 FldldController.phpのクラス構成を追加