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)
_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"> 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 .. ..
.. ..
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,
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.
Total 9 comments
when i try your code for insert, it insert 1 record contain filename with random number and 2 record contain just random numbers?
Ok, so you want to store default.jpg in database and no saveAs function on empty image field.
so, just do following step:
set fileName default.jpg on empty field as
and for saveAs function use below code,
I had tested it and working fine... :D
Hi, if no image is submitted the page freezes. I've to do something like
in order to prevent it. Also i've to do the same here
This declaration inside rules
should not prevent this error?
Thanks for your help
yes, i think that part was missing. @kmindi, thankx for update.
I could not get it to work until i added
to my options array to the form (using
EBootstrapActiveForm)I updated the article to contain that information too ...
@shaan360, its ok if you do not add scenario on update. you specify in model and not specify in model as $model->scenario='update' than its ok, if you specify user define scenario the you have to specify in controller. cheers..
and dont forget to set the scenario
$model->scenario='update';
@speedlog, yes you rite, but this is just for demo purpose as upload image with random name.
Better way is first save record and than save image, where in file name should be Primary Key of this record (PK guarantee unique). All involved in transaction and when file will not be saved than rollback.
Leave a comment
Please login to leave your comment.