CakePHP meioupload, загрузка изображения в разные папки для каждой модели

#cakephp #image-upload #meio-upload

#cakephp #изображение-загрузить #meio-загрузка

Вопрос:

Я использую meioupload для загрузки изображений в CakePHP, я использую таблицу под названием «вложение» для сохранения информации о загруженном изображении, это структура моей таблицы вложений:

 CREATE TABLE IF NOT EXISTS `attachments` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `created` datetime NOT NULL,
  `modified` datetime NOT NULL,
  `class` varchar(100) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  `foreign_id` bigint(20) unsigned NOT NULL,
  `filename` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  `dir` varchar(100) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  `mimetype` varchar(100) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL,
  `filesize` bigint(20) DEFAULT NULL,
  `height` bigint(20) DEFAULT NULL,
  `width` bigint(20) DEFAULT NULL,
  `description` text NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1;
  

И в настоящее время у меня есть еще 2 таблицы, связанные с этим через поле class (имя таблицы) и foreign_id. Теперь мой вопрос в том, как я могу сохранить загруженное изображение в другую папку для каждой модели?

Например: я хотел бы сохранить изображение моего поста в папку «post» и сохранить изображение моего профиля в папку «profile»

ОБНОВЛЕНИЕ: в моей модели вложения

 public $actsAs = array(
    'MeioUpload' => array(
        'filename' => array(
            'dir' => 'post', #i set the default folder as 'post' at the moment
            'create_directory' => true,
            'allowed_mime' => array(
                'image/jpeg',
                'image/pjpeg',
                'image/png'
            ),
            'allowed_ext' => array(
                '.jpg',
                '.jpeg',
                '.png'
            ),
            'thumbsizes' => array(                  
                'large' => array(
                    'width' => 500,
                    'height' => 500
                ),
                'small' => array(
                    'width' => 100,
                    'height' => 100
                )
            )
        )
    )
);
  

ОБНОВЛЕНИЕ № 2: допустим, что в настоящее время у меня есть 3 таблицы: «вложение», «публикация» и «профиль», та, которая действует при загрузке, называется «вложение», каждый раз, когда я загружаю изображение через «сообщение» или «профиль», я сохраняю информацию об изображении в полях «вложение», foreign_id и class в «attachment» — это то, которое соединяет «вложение» с «сообщением» и «профилем».

ОБНОВЛЕНИЕ # 3: я последовал совету Dunhamzzz по использованию поведения «на лету» и придумал это решение, и оно работает.

 $this->Attachment->Behaviors->attach(
    'MeioUpload', array(
        'filename' => array(
            'dir' => 'avatars'
        )
    ));
  

Спасибо

Комментарии:

1. пожалуйста, опубликуйте свой код $ ActAs из ваших моделей.

Ответ №1:

Ответ находится в вашем MeioUpload, в частности, в опции ‘dir’, которую вы можете указать {ModelName} или {fieldName} , чтобы изменить место сохранения файла. Вот значение по умолчанию в самом поведении:

dir' => 'uploads{DS}{ModelName}{DS}{fieldName}',

Обновить

Чтобы заставить MeioUpload поддерживать разные настройки для одной и той же модели, вы могли бы попробовать подключить поведение «на лету», что позволяет изменять настройки по своему усмотрению.

например, в вашем действии posts

 $this->Attachment->Behaviours->attach('MeioUpload', array('dir' => '/uploads/posts/');
  

Обязательно прочитайте часть о поведении в документах, мы надеемся, это поможет вам выработать решение для каждого действия, в отличие от модели, которая поставляется с поведением.

Комментарии:

1. хм, это не то, что я имею в виду, если я сделаю {ModelName}, это загрузит изображения только в папку «вложение», поскольку та, которая ведет себя подобным образом, является моделью «вложение», тогда я обновлю свой вопрос.

2. @dunhamzz куда это следует прикрепить? я пытаюсь использовать его внутри моего контроллера, и это не работает

3. Я предполагаю, что прикрепите его в действии контроллера, а не в $ actsAs, просто убедитесь, что вы передаете ему все настройки, когда вы его прикрепляете.

4. ооо, это опечатка, это должно быть «поведение» вместо «behaviours» я думаю, именно поэтому я получил сообщение об ошибке, я собираюсь попробовать еще раз, и я дам вам знать. Спасибо

5. это работает, хотя мне нужно несколько модификаций, спасибо, что указали мне на это

Ответ №2:

Вот пример для массива $ActAs.

     'MeioUpload' => array(
        'filename' => array(
            'dir' => 'files/banners',
            'create_directory' => false,
            'allowed_mime' => array(
                'image/jpeg',
                'image/pjpeg',
                'image/gif',
                'image/png'
            ),
            'allowed_ext' => array(
                '.jpg',
                '.jpeg',
                '.png',
                '.gif'
            ),
        )
    ),
  

как вы можете видеть, есть ключ «dir», который вы можете изменить