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 "
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.
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?