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.

Links
15 0
39 followers
Viewed: 211 416 times
Version: 1.1
Category: Tips
Written by: kiran sharma
Last updated by: Shahcheraghean
Created on: Jul 6, 2012
Last updated: 11 years ago
Update Article

Revisions

View all history

Related Articles