Під час створення одного з проектів, в мене виникла ідея створення декількох поведінок для того, щоб зробити своє життя легшим. Але як завжди, після того як я пройшовся по пекарні виявилось що добрі дядьки вже це зробили.
Далі я розповім вам про те, як використовувати поведінку для автоматичного завантаження файлів на сервер, і запису шляху до завантаженого файлу в таблицю.
Як завжди, все дуже просто. Використовуємо MeioUpload Behavior написаний Vinicius Brandao Mendes.
Поведінка дозволяє завантажити будь-який файл. Після того, як файл буде завантажено, його ім?я буде записано в поле таблиці. Окрім того, він підтримує валідацію типів файлів (включаючи MIME тип), розмірів, тощо.
Використання:
- Завантажуємо meio_upload.php і кидаємо в app/models/behaviors
- Якщо маєте бажання використовувати зменьшенні копії, то встановить ще компонент phpThumb
- Додайте до таблиці поле типу varchar. Наприклад:
CREATE TABLE `products` (
`id` int(8) unsigned NOT NULL auto_increment,
`name` varchar(255) default NULL,
`description` text default NULL,
`price` double default NULL,
`picture` varchar(255) default NULL,
`dir` varchar(255) default NULL,
`mimetype` varchar(255) NULL,
`filesize` int(11) unsigned default NULL,
`created` datetime default NULL,
`modified` datetime default NULL,
PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; |
- Додайте поведінку до моделі
var $actsAs = array(
'MeioUpload' => array(
'picture' => array(
'dir' => 'img{DS}{model}{DS}{field}',
'create_directory' => true,
'allowed_mime' => array('image/jpeg', 'image/pjpeg', 'image/png'),
'allowed_ext' => array('.jpg', '.jpeg', '.png'),
'default' => 'default.jpg',
)
)
); |
- Використовуєм хелпер form і додаємо в вид поле picture:
echo $form->input('picture', array('type' => 'file')); |
- Обов?язково використовуйте форму типу multipart/form-data, наприклад так:
echo $form->create('Product',array('type' => 'file')); |
- Це все, зображення завантаженно. Не забудьте перевірити права доступу до директорії, а також максимально дозволений розмір файлу для завантаження в php.ini
Опції
Як відомо під час ініціалізацї поведінки можна задавати додаткові опції.
- dir – тут можна вказати шлях для завантаження файлів. Він буде знаходитись всередині /app/webroot. Наприклад, якщо ви вказали шлях “imgs”, то він буде знаходитись в /app/webroot/imgs/
- allowed_mime – дозволяє вибрати які типи MIME можна буде завантажити. Наприклад таке:
var $actsAs = array(
'picture' => array(
'allowed_mime' => array('image/jpeg', 'image/pjpeg', 'image/png')
)
); |
- allowed_ext - теж саме, тільки перевіряється розширення
var $actsAs = array(
'picture' => array(
'allowed_ext' => array('.jpg', '.jpeg', '.png')
)
); |
- create_directory - чи треба створювати діректорію, якщо вона не існує. Дефолтне значення – True
- default - файл, що встановлюється, якщо нічого не було завантаженно
- fields - встановлює відповідність полів таблиці з інормацією про файл. Можна зберегти ім?я файла, розмір і шлях.
var $actsAs = array(
'picture' => array(
'fields' => array(
'filesize' => 'picture_filesize',
'mimetype' => '{field}_mimetype',
'dir' => 'pictures_folder'
)
)
); |
Ви можете помітити, що {field} буде замінено на ім?я файла.
Валідація
- FieldName - перевіряє чи поле в таблиці вже підготовлено
- Dir - перевіряє чи існує шлях. Залежить від опції create_directory
- Empty - перевіряє чи поле пусте
- UploadError - перевіряє чи була помилка під час завантаження
- MaxSize - перевіряє чи файл меньший за максимальний розмір
- InvalidMime -перевіряє чи файл має вірний тип MIME
- InvalidExt - перевіряє чи файл має вірне розширення
Ось приклади. Перевірка на вірне розширення, а також валідатор Empty віключено (check=>false)
var $validate = array(
'picture' => array(
'Empty' => array(
'check' => false
),
'InvalidExt => array(
'message' => 'Файл такого типу не дозволено завантажувати'
)
)
); |
Як видалити файл?
Якщо переслати в формі не пусте поле data[Model][field][remove], поведінка автоматично видалить файл. Наприклад можна використовувати чекбокс:
echo $form->input('Product.picture.remove', array('type' => 'checkbox')); |
UPD: Зменшені копії
Окрім основної функціональності, поведінка за допомогою компонента phpThumb дозволяє створювати зменшені копії зображення. Наприклад в такий спосіб:
var $actsAs = array(
'MeioUpload' => array(
{ ... }
'thumbsizes' => array(
'smalled' => array('width'=>50, 'height'=>50),
'original' => array('width'=>100, 'height'=>100),
),
)
)
); |
Зверніть увагу на массив thumbsizes. Він вказує на розміри зображень яки будуть завантажені. Елемент під назвою “original” вказує на розмір, до якого буде зменшено оригінальне зображення, а усі інші створять копії. В цьому прикладі копія матиме назву thumb.smalled.{ІМ?Я_ФАЙЛУ}.
This entry was posted
on Wednesday, January 28th, 2009 and is filed under
cakephp,
PHP-разработка.
You can follow any responses to this entry through the
RSS 2.0 feed.
You can
leave a response, or
trackback from your own site.
Hi,
I am the developer of the MeioUploadBehavior. What language is this? I want to put a link to this translation in my blog.
Nice to meet you! Thanks a lot for your behavior, it's really handy and useful. That's Ukrainian language, the post is very close to original one except the introduction part.
[...] Documentation translated to Ukrainian [...]