Uploadプラグインの中でも評価の高かった、
https://github.com/josegonzalez/cakephp-upload
これを実装してみたのでメモ。
オプションも多く、使いやすそう。
今回使ったのは、以下のオプション。
'path' => '{ROOT}webroot{DS}files{DS}thumb{DS}', 'fields' => array( 'dir' => 'image_directry', ), 'thumbnailSizes' => array( 'xvga' => '1024x768', 'vga' => '640x480', 'cubic' => '200x200', 'thumb' => '80x80' )
'path'
画像の格納パス。この場合はアップロードされた画像はwebroot/files/thumb/~
'fields'
画像名が入るDBフィールド。
'thumbnailSizes'
thumbnailSizeを使っうとそれぞれのサイズが{size-name}_file_name で生成。
サイズ指定のオプションは以下。
100×80 – アスペクト比を保ち、トリミングを行う
[100×80] – 指定したアスペクト比にフィットさせる
100w – アスペクト比を保ち、幅100px
80h – アスペクト比を保ち、縦80px
その他にも、画像のサイズの最大・最小値の指定やパーミッション、上書きの可否等も指定できるようだ。
また細かいバリデーションをかけてエラーメッセージの指定も可能。
例:
public $validate = array( 'image' => array( 'isUnderPhpSizeLimit' => array( 'rule' => 'isUnderPhpSizeLimit', 'message' => 'File exceeds upload filesize limit' ), 'isCompletedUpload' => array( 'rule' => 'isCompletedUpload', 'message' => 'File was not successfully uploaded' ), 'tempDirExists' => array( 'rule' => 'tempDirExists', 'message' => 'The system temporary directory is missing' ), 'isFileUploadOrHasExistingValue' => array( 'rule' => 'isFileUploadOrHasExistingValue', 'message' => 'File was missing from submission' ), 'isWritable' => array( 'rule' => array('isWritable'), 'message' => 'File upload directory was not writable' ), 'isValidDir' => array( 'rule' => array('isValidDir'), 'message' => 'File upload directory does not exist' ), 'isBelowMaxSize' => array( 'rule' => array('isBelowMaxSize', 1024), 'message' => 'File is larger than the maximum filesize' ), 'isValidExtension' => array( 'rule' => array('isValidExtension', array('pdf', 'png', 'txt')), 'message' => 'File does not have a pdf, png, or txt extension' ), ) );
Ex
簡単に実装テスト。テーブル構成がこんな感じで
CREATE table users ( id int(10) unsigned NOT NULL auto_increment, username varchar(20) NOT NULL, image varchar(255) image_directry varchar(255) );
Userクラスには、$actsAsを追加。
public $actsAs = array( 'Upload.Upload' => array( 'image' => array( 'path' => '{ROOT}webroot{DS}files{DS}thumb{DS}', 'fields' => array( 'dir' => 'image_directry', ), 'thumbnailSizes' => array( 'xvga' => '1024x768', 'vga' => '640x480', 'cubic' => '200x200', 'thumb' => '80x80' ) ) )
コントローラではadd functionを持っているものとします。
public function add() { if ($this->request->is('post')) { $this->User->create(); if ($this->User->save($this->request->data)) { $this->Session->setFlash(__('The user has been saved')); $this->redirect(array('action' => 'index')); } else { $this->Session->setFlash(__('The user could not be saved. Please, try again.')); } } }
ビューはこんな感じ。
Form->create('User', array('type' => 'file')); ?> Form->input('username'); ?> Form->input('image', array('type' => 'file')); ?> Form->input('image_directry', array('type' => 'hidden')); ?> Form->end(); ?>