Rename Dei File

Ciao a tutti,

ho creato un’actionCreate che permetta di fare l’upload delle immagini, salvando sul DB il nome del file che funziona esattamente come voglio.

Ora ho bisogno di rinominare il file in modo che, se l’utente carica due files con lo stesso nome, questo venga rinominato con un nome random così da evitare l’incongruenza tra i due file e per sostituire caratteri particolari come gli spazi con degli underscore.

Per fare questo, ho caricato l’estensione CFile, ma vi è sicuramente un’incongruenza tra i tipi di file.

Quella che segue è l’actionCreate:




public function actionCreate()

	{

		

		$model=new Articoli;


		// Uncomment the following line if AJAX validation is needed

		// $this->performAjaxValidation($model);


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

		{

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

			

			//prende l'istanza dell'immagine che è stata caricata con POST (in questo caso)

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

			$c_image = $model->image;

			

			

			//rename

			$myfile = Yii::app()->file->set(Yii::getPathOfAlias('webroot').'/images/articoli/'.$model->image, true);

			$random = substr(number_format(time() * rand(),0,'',''),0,10);

			$myfile->rename($random);

			$model->image = $myfile; //->filename;

			//end rename

			

			if($model->save()){

				if(isset($c_image)){

					//nell'attributo "image" delal tabella, viene salvato il percorso del file

					$file = Yii::getPathOfAlias('webroot').'/images/articoli/'.$model->image;

					$model->image->saveAs($file);

					

					//Creo il thumbnail per l'anteprima

					$thumb = Yii::app()->phpThumb->create($file); //Yii::app()->baseUrl.'/images/articoli/'.$model->image

					$thumb->resize(128,128);

					$thumb->save(Yii::getPathOfAlias('webroot').'/images/articoli/thumbnails/thumb_'.$model->image);

					}//if

				}//if

				

			

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

		}

		

		

		

		$this->render('upload',array( //'create',array(

			'model'=>$model,

		)); 

}



Se eseguo il codice, Yii mi dà un’errore sul tipo:

"Object of class CFile could not be converted to string "

solo che non so come risolverlo.

Non sarà perchè stai passando a $model->image un oggetto CFile invece della stringa contenente il nome del file?

Io faccio così





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

 	$rnd = rand(0,9999);  

 	$ext = $uploadedFile->getExtensionName();

	$fileName = "{$rnd}.{$ext}"; 

        $model->image = Yii::app()->params['image_folder'].$fileName;



Ciao ciao

Io in genere faccio come Giacomo con la differenza che utilizzo la funzione md5 sulla data corrente più un numero casuale per generare il nome dell’immagine. Non mi limito ad usare solo il numero random perché è una soluzione poco scalabile se il numero di immagini aumenta.

Io ho poca fantasia, e uso direttamente l’id autoincrement del file come elemento discriminante.

Quello che ottengo usando le righe di codice che mi avete suggerito è questo:

Il problema è dato dal momento in cui memorizzo informazioni su $model->image e quindi viene eseguito $model->image->saveAs($file) sul pezzo di codice:




if($model->save()){

                                if(isset($c_image)){

                                        //nell'attributo "image" delal tabella, viene salvato il percorso del file

                                        $file = Yii::getPathOfAlias('webroot').'/images/articoli/'.$model->image;

                                        $model->image->saveAs($file);

                                        

                                        //Creo il thumbnail per l'anteprima

                                        $thumb = Yii::app()->phpThumb->create($file); //Yii::app()->baseUrl.'/images/articoli/'.$model->image

                                        $thumb->resize(128,128);

                                        $thumb->save(Yii::getPathOfAlias('webroot').'/images/articoli/thumbnails/thumb_'.$model->image);

                                        }//if

                                }//if



Però così ottengo lo stesso errore di prima, purtroppo.

Comunque avevo passato il nome del file al posto dell’oggetto, usando $model->image = $myfile->filename ma il risultato non cambiava.

Una domanda: il seguente codice dovrebbe salvare il percorso intero del file?


$model->image = Yii::app()->params['image_folder'].$filename;

Ci rinuncio perché il progetto su cui sto lavorando dev’essere finito a breve quindi aggirerò il problema facendo un check con un validatore custom.

Infatti ora mi tocca aprire un altro topic a riguardo perché ho già problemi anche in quello (comunque più semplici, spero!).

Grazie comunque per l’aiuto.

Magari in futuro avrò bisogno di riaprire questa discussione o qualcuno ne avrà bisogno.