загрузка картинок(вообще файлов)

Мне надо дать менеджеру возможность загружать в images картинки, чтобы потом дать возможность выбрать загруженную картинку в другой форме. посмотрел http://dbhelp.ru/form-file-upload/page/ но тут Item extends CActiveRecord что и не понятно. Может кто подскажет примерный план действий.

По ссылке, автор использует CActiveRecord для того что бы воспользоваться функцией валидации, проверит что передано через post в переменную image. Если тип загруженного файла будет jpg, gif, png то происходит запись чего то в базу, и сохранение файла на сервер. Если тип не соответствует, то сново отобразиться форма с сообщением об ошибке в image.

Если не нужно делать запись в базу то можно воспользоваться и CModel или что даже лучше сразу CFileValidator

я так понял рекомндуется сделать так:

  • в форме ввода итема должно быть поле выбора файла,

  • в модели итема должно быть правило валидации

при выборе файла и сабмите выбранный файл загружается на сервер в папку image. что дальше: если делается апдейт итема - можно сделать если пусто показывать таг выбора файла если что-то есть показывать файл. но что делать если файл есть и надо его менять.

думаю сделать отдельный контроллер именно для загрузки файлов а в контроллере итемов уже дроплист выбора нужного файла. поэтому сделал вот так:

модель:


<?php

class Image extends CFormModel


{

    public $image;

    

 

    public function rules()

    {

        return array(

            array('image', 'file', 'types'=>'jpg, gif, png'),

        );

    }

}

?>

контроллер:




<?php


class ImageController extends CController

{

	

	

    public function actionCreate()

    {

        $model=new Image;

		echo $_POST['image'];

        if(isset($_POST['image']))

        {

            $model->attributes=$_POST['image'];

			

            $model->image=CUploadedFile::getInstance($model,'image');

            if($model->save())

            {

                $model->image->saveAs('images/test');

                

            }

        }

        $this->render('create', array('model'=>$model));

    }

}


?>



и вью:


<?php echo CHtml::form('','post',array('enctype'=>'multipart/form-data')); ?>

...

<?php echo CHtml::activeFileField($model, 'image'); ?>


<div class="row buttons">

	<?php echo CHtml::submitButton('Create' ); ?>

</div>

</form>

…и что-то не работат - ошибок нет но и файлы не грузятся. кто подскажет?

Меня смущает строчка




if(isset($_POST['image']))



Имя модели то у вас с большой буквы начинается.

Само собой, проверьте, что есть права на запись в директорию.




$model->image->saveAs('images/test');



Файл у вас сохранится в директорию images под именем test (без расширения).

Еще я бы весь этот блок с сохранением вынес в метод afterSave() класса Image.

странно то что форма не возвращает никаких значений из


<?php echo CHtml::activeFileField($model, 'image'); ?>

  • элемент массива $_post с именем image есть но он пустой.

сделал примерно так


<?php echo CHtml::beginForm('','post',array('enctype'=>'multipart/form-data')); ?>

<?php echo CHtml::activeFileField($model, 'image'); ?>

<?php echo CHtml::activeTextField($model, 'retro'); ?>

<?php echo CHtml::submitButton('Create' ); ?>

<?php echo CHtml::endForm(); ?>

в контроллере дописал


var_dump ( $_POST );

резльтат


array(2) { ["Item"]=> array(2) { ["image"]=> string(0) "" ["retro"]=> string(9) "text-text" } ["yt0"]=> string(6) "Create" }  

получается поле retro возвращается а image - нет. мистика

так что тут может быть не так?


var_dump($_FILES);

ага все заработало. ошибка


if(isset($_POST['image']))