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');

以上、シンプルなファイルのアップロードフォームの作り方でした。