Как загрузить файл используя модель
Во первых: объявим атрибут (свойство) в модели, которое будет содержать имя файла. Также объявим правила валидации для загружаемого файла, чтобы разрешить загружать файлы определенного типа.
class Item extends CActiveRecord { public $image; // другие свойства public function rules(){ return array( //устанавливаем правила для файла, позволяющие загружать // только картинки! array('image', 'file', 'types'=>'jpg, gif, png'), ); } }
Затем в контроллере определяем метод, который будет выводить форму и принимать данные из неё:
class ItemController extends CController { public function actionCreate(){ $model=new Item; if(isset($_POST['Item'])){ $model->attributes=$_POST['Item']; $model->image=CUploadedFile::getInstance($model,'image'); if($model->save()){ $model->image->saveAs('path/to/localFile'); // перенаправляем на страницу, где выводим сообщение об // успешной загрузке } } $this->render('create', array('model'=>$model)); } }
Если происходит загрузка нескольких файлов, код будет таким:
if($model->save()){ foreach($model->image as $file){ $file->saveAs('path/to/localFile'); } // перенаправляем на страницу, где выводим сообщение об // успешной загрузке }
И, наконец, создаём представление с формой:
echo CHtml::form('','post',array('enctype'=>'multipart/form-data')); … <?php echo CHtml::activeFileField($model, 'image'); … <?php echo CHtml::endForm();
Примечание: При загрузке файла, естественно, можно проверять не только тип файла, но также размер, и другие параметры. Вот пример правила, которое разрешает загрузку картинок размером не больше 1 Мб:
public function rules(){ return array( // Максимальный и минимальный размер указываем в байтах. array('image', 'file', 'types'=>'jpg, gif, png', 'maxSize' => 1048576), ); }Подробнее о доступных правилах валидации можно прочитать в API класса CFileValidator.
- Основан на: http://www.yiiframework.com/doc/cookbook/2/
- Перевод и примечание: Pirrat

