I saw many posts that community newbie is confuse in image/photo upload with random name. so I post this topic covering all useful things regarding to image/photo upload(not covering image attribute related functionality)
View :
_form.php file:
..
//form options array...
'htmlOptions' => array(
'enctype' => 'multipart/form-data',
),
...
..
//Other elements
..
..
<divclass="row">
<?phpecho$form->labelEx($model,'image');
<?phpechoCHtml::activeFileField($model, 'image'); // by this we can upload image
<?phpecho$form->error($model,'image');
</div>
<?phpif($model->isNewRecord!='1'){
<div class="row">
echoCHtml::image(Yii::app()->request->baseUrl.'/banner/'.$model->image,"image",array("width"=>200)); // Image shown here if page is update page
</div>
..
..
Other elements
..
..
.. ..
Model :
just add below line in rules() method in Model
array('image', 'file','types'=>'jpg, gif, png', 'allowEmpty'=>true, 'on'=>'update'), // this will allow empty field when page is update (remember here i create scenario update)
for all others rules you had to give scenario for insert and update as the rule will apply on both page( Insert and Update ) i.e:
array('title, image', 'length', 'max'=>255, 'on'=>'insert,update'),
.. .. Now comes the main part,
Controller :
Create controller will upload image with random name and enter required database entry.
publicfunctionactionCreate()
{
$model=newBanner; // this is my model related to table
if(isset($_POST['Banner']))
{
$rnd = rand(0,9999); // generate random number between 0-9999
$model->attributes=$_POST['Banner'];
$uploadedFile=CUploadedFile::getInstance($model,'image');
$fileName = "{$rnd}-{$uploadedFile}"; // random number + file name
$model->image = $fileName;
if($model->save())
{
$uploadedFile->saveAs(Yii::app()->basePath.'/../banner/'.$fileName); // image will uplode to rootDirectory/banner/
$this->redirect(array('admin'));
}
}
$this->render('create',array(
'model'=>$model,
));
}
Now comes the update action,
publicfunctionactionUpdate($id)
{
$model=$this->loadModel($id);
if(isset($_POST['Banner']))
{
$_POST['Banner']['image'] = $model->image;
$model->attributes=$_POST['Banner'];
$uploadedFile=CUploadedFile::getInstance($model,'image');
if($model->save())
{
if(!empty($uploadedFile))// check if uploaded file is set or not
{
$uploadedFile->saveAs(Yii::app()->basePath.'/../banner/'.$model->image);
}
$this->redirect(array('admin'));
}
}
$this->render('update',array(
'model'=>$model,
));
}
Above example is Upload image in specific folder and enter require entry in database. On update it will overwrite image in folder and update the data.