CakePHP2.x系で画像のアップロードフォームを作りたかったので調べたところ、アップロードの先の格納方法が2通りある事に気づき、両方やってみたのでメモしておきます。
見出し
①アップロードした画像をデータベースに格納する方法
テーブル定義例
1 2 3 4 5 6 7 8 |
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)
1 2 3 4 5 6 7 8 |
<?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)
1 2 3 4 5 6 |
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に格納できました。
②アップロードした画像をディレクトリに格納する方法
テーブル定義例
1 2 3 4 5 6 |
CREATE TABLE tests ( id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, created DATETIME DEFAULT NULL, modified DATETIME DEFAULT NULL, deleted DATETIME DEFAULT NULL ); |
①と比べ、画像に関する項目がいらなくなりました。
フォーム(add.php)
1 2 3 4 5 6 7 8 |
<?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)
1 2 3 4 5 |
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などでファイル名をつけて格納しました。
画像アップロードのコントローラーとビューのコードをまとめました。
参考サイト様
http://bashalog.c-brains.jp/10/06/05-074544.php
http://kwski.net/cakephp-2-x/1152/