How to upload image(photo), and path entry in database with update functionality

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
..
..
<
div class="row">
<?
php echo $form->labelEx($model,'image'); ?>
<?
php echo CHtml::activeFileField($model, 'image'); ?> // by this we can upload image
<?
php echo $form->error($model,'image'); ?>
</
div>
<?
php if($model->isNewRecord!='1'){ ?>
<div class="row">
<?php echo CHtml::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.
public function actionCreate()
{
$model=new Banner; // 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,
public function actionUpdate($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.

Leave a comment

Your email address will not be published. Required fields are marked *