Error con metodo getHasError de CUploadedFile

Anteriormente publique una manera de poder subir archivos a una BD… ahora continuando con las validaciones de esa forma obtengo un error con el metodo getHasError…




$model=$this->loadModel();

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

{

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

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

	

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

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

		$model->extension = $archivo->type;

		

		$model->content = file_get_contents($archivo->getTempName());

		if($model->save()) {

		     $result = "<h3>Archivo guardado OK...</h3>";

		}

	}

	else

		$result = "<h3>Error: ".$archivo->getError()."</h3>";

}


$this->render('update',array(

	'model'=>$model,

	'result'=> (isset($_POST['ModelArchivo'])) ? $result : '',

));



Lo que trato de hacer es que sin haber seleccionado algun archivo, simplemente presiono sobre el boton de upload… El codigo esta preparado para que si llegase a ocurrir un error, muestre el mensaje "ERROR", pero al parecer algo malo esta ocurriendo sobre la linea if(!$archivo->getHasError()){ generando en php un error "Call to a member function getHasError() on a non-object"… La pregunta es si tengo algo malo en el acceso a getHasError() ?

Hola

No me parece que tengas un error en tu código.

Lo que sucede es que no hay archivo o archivo esta vacío, por eso dice que has llamado la función en un non-object.

Lo que yo hago es esto:




	$file = CUploadedFile::getInstance($model, 'logo');

	if ($file != '') {

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



Aprovecho para mencionarte que tengas cuidado en el Update, porque si el usuario no manda un archivo, lo mas probable es que al actualizar tu registro, se borre el nombre del archivo anterior.

Para solucionar esto, hice esto en mi actionUpdate:




	public function actionUpdate()

	{

		$model=$this->loadModel();

		if ($model->logo != '') {

			// si no esta vacío, cargo el nombre del archivo anterior

			$logo = $model->logo;

		}

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

		{

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

			$file = CUploadedFile::getInstance($model, 'logo');

			if ($file != '') {

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

			    	// proceso mi archivo

			} else {

				// si file esta vacío (es decir, no se subió archivo), entonces usa el nombre anterior

				$model->logo = $logo;

			}

			// etcetera, etcetera

	}



Espero te sea útil.

Saludos.

Luego de mi post estuve intentando resolver mi problema, así como lo comentas de que el error se provoca porque no se envió ningun archivo, hice algunos cambios… y la línea que provocaba el error la modifique… quedando de la siguiente manera…




if((isset($_POST['ModelArchivo'])) && (!empty($_FILES['ModelArchivo']['tmp_name']['content'])))



Con esto valido de que se haya enviado un archivo y para asegurarme de que nunca ocurra algun error cuando no se sube el archivo, agregue la linea que me dijiste…




if((isset($_POST['ModelArchivo']))&&(!empty($_FILES['ModelArchivo']['tmp_name']['content']))&&($Archivo != ''))



Woo… muchas gracias por la respuesta…

Hola Jack… Buenos Dias!1 al principio de este post inidca que anteriormente subistes de Cómo subir archivos en la BD… Donde puedo encontrar ese post que busque y busque y nada… Estoy usando el CUploadedFile y me guarda el nombre del archivo en la BD más no me guarda la dirección ni el archivo en la carpeta que le estoy diciendo… te agradeceria tu ayuda Gracias!!!