earth-upload-48x48Під час створення одного з проектів, в мене виникла ідея створення декількох поведінок для того, щоб зробити своє життя легшим. Але як завжди, після того як я пройшовся по пекарні виявилось що добрі дядьки вже це зробили.
Далі я розповім вам про те, як використовувати поведінку для автоматичного завантаження файлів на сервер, і запису шляху до завантаженого файлу в таблицю.

Як завжди, все дуже просто. Використовуємо MeioUpload Behavior написаний Vinicius Brandao Mendes.

Поведінка дозволяє завантажити будь-який файл. Після того, як файл буде завантажено, його ім?я буде записано в поле таблиці. Окрім того, він підтримує валідацію типів файлів (включаючи MIME тип), розмірів, тощо.

Використання:

  1. Завантажуємо meio_upload.php і кидаємо в app/models/behaviors
  2. Якщо маєте бажання використовувати зменьшенні копії, то встановить ще компонент phpThumb
  3. Додайте до таблиці поле типу varchar. Наприклад:
  4. 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;
  5. Додайте поведінку до моделі
  6. 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',
    		)
    	)
    );
  7. Використовуєм хелпер form і додаємо в вид поле picture:
  8. echo $form->input('picture', array('type' => 'file'));
  9. Обов?язково використовуйте форму типу multipart/form-data, наприклад так:
  10. echo $form->create('Product',array('type' => 'file'));
  11. Це все, зображення завантаженно. Не забудьте перевірити права доступу до директорії, а також максимально дозволений розмір файлу для завантаження в php.ini

Опції

Як відомо під час ініціалізацї поведінки можна задавати додаткові опції.

  1. dir – тут можна вказати шлях для завантаження файлів. Він буде знаходитись всередині /app/webroot. Наприклад, якщо ви вказали шлях “imgs”, то він буде знаходитись в /app/webroot/imgs/
  2. allowed_mime – дозволяє вибрати які типи MIME можна буде завантажити. Наприклад таке:
  3. var $actsAs = array(
    	'picture' => array(
    		'allowed_mime' => array('image/jpeg', 'image/pjpeg', 'image/png')
    	)
    );
  4. allowed_ext - теж саме, тільки перевіряється розширення
  5. var $actsAs = array(
    	'picture' => array(
    		'allowed_ext' => array('.jpg', '.jpeg', '.png')
    	)
    );
  6. create_directory - чи треба створювати діректорію, якщо вона не існує. Дефолтне значення – True
  7. default - файл, що встановлюється, якщо нічого не було завантаженно
  8. fields - встановлює відповідність полів таблиці з інормацією про файл. Можна зберегти ім?я файла, розмір і шлях.
  9. var $actsAs = array(
    	'picture' => array(
    		'fields' => array(
    			'filesize' => 'picture_filesize',
    			'mimetype' => '{field}_mimetype',
    			'dir' => 'pictures_folder'
    		)
    	)
    );

Ви можете помітити, що {field} буде замінено на ім?я файла.

Валідація

  1. FieldName - перевіряє чи поле в таблиці вже підготовлено
  2. Dir - перевіряє чи існує шлях. Залежить від опції create_directory
  3. Empty - перевіряє чи поле пусте
  4. UploadError - перевіряє чи була помилка під час завантаження
  5. MaxSize - перевіряє чи файл меньший за максимальний розмір
  6. InvalidMime -перевіряє чи файл має вірний тип MIME
  7. 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.

3 Responses to “Поведінки, CakePHP та завантаження файлів на сервер.”

  1. Hi,

    I am the developer of the MeioUploadBehavior. What language is this? I want to put a link to this translation in my blog.

  2. 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.

  3. [...] Documentation translated to Ukrainian [...]

Leave a Reply

free counters

Designed by Gabfire
Rambler's Top100