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のクラス構成を追加