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

Я использую 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 таблицы, связанные с этим через поле класса (имя таблицы) и Foreign_id. Теперь мой вопрос: как я могу сохранить загруженное изображение в другую папку для каждой модели?

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

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

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 таблицы: «вложение», «сообщение» и «профиль», та, которая действует как meioupload, является «вложением», каждый раз, когда я загружаю изображение через «сообщение». " или "профиль", я сохраню информацию об изображении в "приложении", поля external_id и class в "приложении" - это те, которые соединяют "приложение" с "публикацией" и "профилем".

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

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

Спасибо


person littlechad    schedule 10.06.2011    source источник
comment
Пожалуйста, опубликуйте свой код $actAs из ваших моделей.   -  person alexdd55    schedule 10.06.2011
comment
@alex я обновил свой вопрос   -  person littlechad    schedule 10.06.2011


Ответы (2)


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

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

Обновить

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

например, в ваших сообщениях

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

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

person Dunhamzzz    schedule 10.06.2011
comment
хм, это не то, что я имею в виду, если я сделаю {ModelName}, он будет загружать изображения только в папку вложений, поскольку тот, который действует как модель вложения, тогда я обновлю свой вопрос. - person littlechad; 10.06.2011
comment
@dunhamzz, куда это прикрепить? я пытаюсь использовать его внутри моего контроллера, и он не работает - person littlechad; 10.06.2011
comment
Я предполагаю, что прикрепите его в действии контроллера, а не в $actsAs, просто убедитесь, что вы передаете ему все настройки, когда прикрепляете его. - person Dunhamzzz; 10.06.2011
comment
о, это опечатка, это должно быть поведение, а не поведение, я думаю, поэтому я получил сообщение об ошибке, я попробую еще раз и дам вам знать. Спасибо - person littlechad; 11.06.2011
comment
это работает, но мне нужно несколько модификаций, спасибо, что указали мне на это - person littlechad; 11.06.2011
comment
Ха-ха, британцы, это британское правописание! - person Dunhamzzz; 11.06.2011
comment
ахаха я не об этом, извини :) - person littlechad; 13.06.2011

Вот пример для массива $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", который вы можете модифицировать

person alexdd55    schedule 10.06.2011