#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», который вы можете изменить