CakePHP2.x系で画像のアップロードフォームを作りたかったので調べたところ、アップロードの先の格納方法が2通りある事に気づき、両方やってみたのでメモしておきます。
①アップロードした画像をデータベースに格納する方法
テーブル定義例
CREATE TABLE tests ( id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, front_image_name VARCHAR(50), front_image_contents mediumblob, created DATETIME DEFAULT NULL, modified DATETIME DEFAULT NULL, deleted DATETIME DEFAULT NULL );
front_image_nameはファイル名になります。
front_image_contentsはファイルになります。blobだと64KBほどしか保存できないようなので、mediumblob(16MBくらい)にしました。
フォーム(add.php)
<?php
echo $this->Form->create('Tets', array('type' => 'file'));
echo $this->Form->input('front_image', array('type' => 'file', 'label' => '画像(表)'));
echo $this->Form->input('created');
echo $this->Form->input('modified');
echo $this->Form->input('deleted');
echo $this->Form->end('Save Toretta');
?>
コントローラー(TestsController.php)
if ($this->request->is('post')) {
$this->request->data['Test']['front_image_name'] = $this->request->data['Test']['front_image']['name'];
$this->request->data['Test']['front_image_contents'] = file_get_contents($this->request->data['Test']['front_image']['tmp_name']);
}
$this->Test->create();
$this->Test->save($this->request->data);
$this->request->data[‘Test’][‘front_image’][‘tmp_name’]は「/tmp/ふぁいるめい」みたいな感じになっていたので、file_get_contentsでバイナリデータにしてDBに格納できました。
②アップロードした画像をディレクトリに格納する方法
テーブル定義例
CREATE TABLE tests ( id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, created DATETIME DEFAULT NULL, modified DATETIME DEFAULT NULL, deleted DATETIME DEFAULT NULL );
①と比べ、画像に関する項目がいらなくなりました。
フォーム(add.php)
<?php
echo $this->Form->create('Tets', array('type' => 'file'));
echo $this->Form->input('front_image', array('type' => 'file', 'label' => '画像(表)'));
echo $this->Form->input('created');
echo $this->Form->input('modified');
echo $this->Form->input('deleted');
echo $this->Form->end('Save Toretta');
?>
①と同じです。
コントローラー(TestsController.php)
if ($this->request->is('post')) {
move_uploaded_file($this->request->data['Test']['front_image']['tmp_name'], '/files/front_' . $this->request->data['Test']['created'] . '.jpg');
}
$this->Test->create();
$this->Test->save($this->request->data);
指定ディレクトリを決めて、その中にIDなどでファイル名をつけて格納しました。
画像アップロードのコントローラーとビューのコードをまとめました。
https://normalblog.net/system/cakephp2-x-file-upload-matome/
参考サイト様
http://bashalog.c-brains.jp/10/06/05-074544.php
http://kwski.net/cakephp-2-x/1152/

![[Vagrant]Logical volume lv_root not found in volume group VolGroup](https://normalblog.net/system/wp-content/uploads/2015/11/vagrant-100x100.png)