Subir un archivo

Hola.

Tengo el formulario del modelo Producto, que tiene una serie de atributos, como precio,…, en la base de datos, guardo esos atributos y el nombre de la foto con su tipo es decir "1.jpg", el controlador tendría que guardar la foto en el directorio x pero con el nombre modificado al de id de su inserción y con su extensión.

El problema está, en que nada más empezar con esto y siguiendo los pasos de este link, parece que no me funciona, el formulario de error me dice: (Archivo no puede ser nulo), cuando sí que se lo he especificado un archivo.

Si alguien sabe que hago mal ;)

Modelo




class Productos extends CActiveRecord { 


        $public archivo;


        public function rules() {

                return array(

                        array('foto', 'required'), 

                        array('foto','length', 'max' => 100),

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

                };

        }


        public function attributeLabels() {

                return array(

                        'foto'=>'Foto',

                        'archivo'=>'Archivo',

                };

        }

}



Controlador




...

        public function actionCreate() {

                $model = new Productos;        


                if (isset($_POST['Productos'])) {

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

                      $archivo=CUploadedFile::getInstance($model,'archivo');

                      $model->foto=$archivo->name;

                      if ($model->save()){               

                             $model->archivo->saveAs('/images/productos/');

                             $this->redirect(array('view', 'id' => $model->id));

                      }

                 }

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

         }

...



Formulario (_form.php)




<?php

    $form = $this->beginWidget('CActiveForm', array(

                'id' => 'productos-form',

                'enableAjaxValidation' => false,

            ));

     $form->errorSummary($model);

?>


<div class="row">

            <?php echo $form->labelEx($model, 'archivo'); ?>

            <?php echo $form->FileField($model, 'archivo'); ?>

            <?php echo $form->error($model, 'archivo'); ?>

</div>


<?php echo CHtml::submitButton($model->isNewRecord ? 'Guardar' : 'Save'); ?>


<?php $this->endWidget(); ?>



creo que te falta poner el nombre del archivo





//$model->archivo->saveAs('/images/productos/');

$model->archivo->saveAs('/images/productos/'.$model->foto);



ademas, deberias chequear:





if ($archivo != '') {

        if(!$archivo->getHasError()){

....



No llega a ejecutar esa línea de código, porque está dentro del if, y la validación del formulario falla, porque dice que el archivo es nulo.

$model->archivo->saveAs(’/images/productos/’.$model->foto);

intenta agregar




<?php $form=$this->beginWidget('CActiveForm', array(

        'id'=>'productos-form',

        'enableAjaxValidation'=>false,

        'htmlOptions' => array('enctype'=>'multipart/form-data'), // la parte que te falta

)); ?>  



He hecho lo que me has comentado y ya funciona ;)

No me he dado cuenta.