CakePHP 2.3でファイルをアップロード・その2 ファイル名を乱数で設定
2014/06/26
Cakephpでファイルのアップロード
ファイル名を乱数にしてセキュリティ向上
先週、CakePHP 2.3でファイルのアップロード処理を作るという記事を書きましたが、今日はその続きです。
前記事のファイルアップロード処理を作る際に、ファイル名をもとのファイル名ではなく、乱数による自動生成されたファイル名を付けるという方法も試してみました。
今回は乱数を元にファイル名を付けていますが、シリアルナンバーを付けたい、といった場合などもこの方法を元にすれば対応は可能ですね。
ベースにしたのは、前回も書いた下記のサイトです。
http://www.almondlab.jp/labs/1043
そのため、View、Model、および、DBの構造は、上記のページと同じですので割愛します。
————–(/Controller/UploadsController.php)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
<?php App::uses('AppController', 'Controller'); /** * Uploads Controller * * @property Upload $Upload */ class UploadsController extends AppController { public $helpers = array('Html', 'Form'); public function index() { $this->Upload->recursive = 0; $this->set('uploads', $this->paginate()); } public function add() { if ($this->request->is('post')) { // 2013.07.19 add 乱数を発生させる処理 $rand = 'abcdefghijklmlopqrstuvwxyzABCDEFGHIJKLMLOPQRSTUVWXYZ0123456789'; $ary_rand = str_split ( $rand ); // array_rand はランダムに配列のキーを取得 for ( $i = 1, $str = ""; $i <= 32; $i++ ) { $rand_key = array_rand ( $ary_rand, 1 ); $str .= $ary_rand[$rand_key]; } $tmp = $this->request->data['Upload']['file']['tmp_name']; if(is_uploaded_file($tmp)) { $file_name = $str; $file = WWW_ROOT.'files'.DS.$file_name; if (move_uploaded_file($tmp, $file)) { $this->Upload->create(); $this->request->data['Upload']['file_name'] = $file_name; if ($this->Upload->save($this->request->data)) { $this->Session->setFlash(__('The upload has been saved')); $this->redirect(array('action' => 'index')); } else { $this->Session->setFlash(__('The upload could not be saved. Please, try again.')); } } } } } } |
————–
途中に乱数を発生させる処理を追加し、ファイル名をそれに置き換える処理になっています。
この処理の要は「move_uploaded_file」でしょうね。それ以外は特に難しいことはないと思います。
途中のコメントの「array_rand はランダムに配列のキーを取得」の次の行にある「32」がランダムで生成する文字列の文字数になりますので、ファイル名の長さを調整したい場合はその数字を変えてもらえればいいでしょう。
また、ファイル名をランダムで取得するには「md5」などが使われていたりもしますが、正確には乱数を取得する関数ではありませんので、それを理解したうえで使った方がいいでしょうね。
GoogleAdwords
GoogleAdwords
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!
関連記事
-
-
CakePHP2の検索Plugin CakeDC/Searchで重複を省くgroup by(distinct)の実装方法
CakePHP2の検索プラグイン「CakeDC/Search」で、重複レコードを省くgroup by、distinctを使う方法についての解説。設定する場所はpaginatorの条件とするので、find()関数と同じ。
-
-
CakePHP3でアソシエーション先のカラムでデータをソートして取得したい
アソシエーション先のテーブルのカラムをキーにソートをしたデータを取得したい!ときの記述方法を解説。「orderAsc()」ではなく「contain()」の中にSort条件を記述する。
-
-
CakePHP3のデバッグキット(DebugKit)を強制的に有効、無効に変更する方法
CakePHP3に付属しているデバッグのためのツール、デバッグキットを強制的に有効化、無効化する方法を解説。初期設定では開発環境としてありそうなドメインの場合のみ有効になるように設定されている。
-
-
CakePHP5でヘルパーから他のヘルパーを読み込む方法・CakePHP4からの変更点
CakePHP5のヘルパーで他のヘルパーを読み込む方法を解説。公式の日本語CookbookはCakePHP4のソースのままで間違っているため注意が必要。CakePHP4からの移行の際も同じ点に注意が必要。
-
-
CakePHP3のユーザ管理・ログイン認証プラグインCakeDC/Usersのインストール解説・3.6以降対応
CakePHP3のユーザ管理プラグイン Usersは、ユーザ登録、メール認証、ログイン認証、ユーザ管理、権限管理、reCAPTCHAなど会員制のサイトを簡単に実現可能。その導入方法、カスタマイズ方法を解説。
-
-
CakePHP3で現在処理しているコントローラー名、アクション名を取得する方法
CakePHP3で現在処理しているコントローラー名、アクション名を取得する方法を解説。複数の方法があるが、getParam()メソッドを使う方法が汎用性があって便利かも。
-
-
CakePHP4の規約外のカラムをキーにアソシエーション(テーブル連結)する方法
CakePHPで規定外のカラム名のキーを指定してアソシエーション(テーブル連結)をする方法を解説。アソシエーション名によってはミスが発生しやすい点もあるので注意も必要。
-
-
CakePHP3のCakeDC/Usersのバリデーションのカスタマイズ方法解説
CakeDC謹製Usersプラグインの紹介。Usersのカスタマイズとして入力項目のバリデーションの変更を、プラグインのファイルは触らずオーバーライドにより実装する方法を解説する。
-
-
CakePHP3でassociatedを使って関連データをまとめて保存する方法(hasOne、hasMany、belongsTo)
CakePHP3で関連データをまとめて保存する方法。hasOne、hasMany、belongsTo等の関連データはassociatedを追加することでまとめて保存することができます。
-
-
CakePHP3のルーティング(routes.php)の変更が反映されない時はキャッシュのクリアを
CakePHP3でルーティングの設定変更をしたけど反映されない!そんなときは慌てず騒がずキャッシュをクリアしよう!ルーティングの設定もキャッシュされることがあるらしい。