Загрузка нескольких файлов

Стоит передо мной задача - загрузить несколько картинок для новости. В поисках решения нашел в cookbook статью (http://www.yiiframework.com/doc/cookbook/29/) и топик на форуме (http://www.yiiframework.com/forum/index.php/topic,1872.0.html).

И то и то меня не устраивает - во-первых я не храню ссылки на фотки в отдельной таблице (хотя может и надо, но это второй вопрос). Во-вторых, раз в yii есть уже классы для загрузки фоток, почему бы их не заюзать.

Покопавшись в системе обнаружил следующее:

Имеем контроллер AdminNews с переменной image. Во вьюхе подключаем виджет

Использую имя AdminNews[image] для соответствия переменной в контроллере. И собственно обрабатываю это с помощью CUploadedFile.

Естественно ничего не работает. Причина в этой строчке

Поскольку загружаем несколько файлов, то переменная $_FILES содержит ключи вида AdminNews[image][0], и в CUploadedFile в переменной $files ключи такие же, а вот переменная $name - AdminNews[image]. Вот и получается что CUploadedFile возвращает null.

Первое решение которое приходит в голову следующее:

пишем функцию поиска ключа в массиве с помощью регулярки

и меняем строчку

на

Теперь при загрузке нескольких файлов CUploadedFile вернет нам массив из файлов. Ну а в контроллере можно использовать следующий код

Я знаю что изобретаю велосипед, и что можно было просто сделать

Но хочется покрасивее  ;D

Может у кого-то есть другой вариант или поправки к моему?

В обработчие перебирайет в цикле массив $_POST['AdminNews']['image']

и используйте CUploadedFile::getInstance($model, "AdminNews[image][$i]);

Вот тут еще обсуждение:

http://www.yiiframew…icseen.html#new

Видимо все-таки не подружить CMultiFileUpload и CUploadedFile без модификации фреймворка…

Склоняюсь к варианту с foreach($_FILES) + move_uploaded_file.

CUploadedFile по сути и есть гольный move_uploaded_file + пара фенек типа getSize(), так что потери не смертельны :slight_smile: