CakePHPで作るシンプルなアップロードフォーム。
CakePHPでファイルをアップロードするための基本機能のみフォームのサンプルです。使用しているCakePHPのバージョンは2.1.2です。
データベースには「uploads」というテーブルを作り、ファイル名を保存するために「file_name」のカラムを設けています。
1 2 3 4 5 6 |
CREATE TABLE uploads ( id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, file_name VARCHAR(50), created DATETIME DEFAULT NULL, modified DATETIME DEFAULT NULL ); |
コントローラーの「UploadsController.php」には、アップロードされたファイル名の一覧のための「index」と、ファイルをアップロードするための「add」アクションを作ります。
(bakeで焼いたものをもとに、手を加えて作成してあります)
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 |
<?php App::uses('AppController', 'Controller'); /** * Uploads Controller * * @property Upload $Upload */ class UploadsController extends AppController { public function index() { $this->Upload->recursive = 0; $this->set('uploads', $this->paginate()); } public function add() { if ($this->request->is('post')) { $tmp = $this->request->data['Upload']['file']['tmp_name']; if(is_uploaded_file($tmp)) { $file_name = basename($this->request->data['Upload']['file']['name']); $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.')); } } } } } } |
ファイルのアップロード処理自体はCakePHP特有のものではなく、通常のPHPの処理になります。途中の「WWW_ROOT」「DS」はCakePHPで用意されている定数で、詳しくはドキュメントページで確認できます。
ここではアップロードされたファイル名のみ、データベースに登録するようにしています。
ファイル名一覧のためのビュー「index.php」です。これもbakeで書き出されたものを、さらに簡略化しています。
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 |
<div class="uploads index"> <h2><?php echo __('Uploads'); ?></h2> <table cellpadding="0" cellspacing="0"> <tr> <th><?php echo __('id'); ?></th> <th><?php echo __('file_name'); ?></th> <th><?php echo __('created'); ?></th> </tr> <?php foreach ($uploads as $upload) : ?> <tr> <td><?php echo h($upload['Upload']['id']); ?></td> <td><?php echo h($upload['Upload']['file_name']); ?></td> <td><?php echo h($upload['Upload']['created']); ?></td> </tr> <?php endforeach; ?> </table> </div><!-- index --> <div class="actions"> <h3><?php echo __('Actions'); ?></h3> <ul> <li><?php echo $this->Html->link(__('New Upload'), array('action' => 'add')); ?></li> </ul> </div><!-- actions --> |
ファイルをアップロードするためのビュー「add.php」では、フォームのタイプをファイル対応にして、アップロードのためのフォームパーツを出力しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<div class="uploads form"> <?php echo $this->Form->create('Upload', array('action' => 'add', 'type' => 'file')); ?> <fieldset> <legend><?php echo __('Add Upload'); ?></legend> <?php echo $this->Form->file('file'); ?> </fieldset> <?php echo $this->Form->end(__('Submit'));?> </div><!-- form --> <div class="actions"> <h3><?php echo __('Actions'); ?></h3> <ul> <li><?php echo $this->Html->link(__('List Uploads'), array('action' => 'index'));?></li> </ul> </div><!-- actions --> |
モデルの「Upload.php」では、今回は特に処理を行っていません。
1 2 3 4 5 6 7 8 |
<?php App::uses('AppModel', 'Model'); /** * Upload Model * */ class Upload extends AppModel { } |
上記以外では、「AppController.php」の中で、「Html」と「Form」ヘルパーを読み込んできます。
1 |
public $helpers = array('Html', 'Form'); |
以上、シンプルなファイルのアップロードフォームの作り方でした。