codejunkie
codejunkie

Reputation: 77

FileUpload to upload image fail to save the image, but no error message displayed

I'm using Yii2 basic. It doesn't seems like anything's wrong, no error message displayed, but why did my image didn't upload? The rest (title, content etc) get uploaded through the form,though

This is my model's rule and related method:

public $image;

 public function init(){
   Yii::$app->params['uploadPath'] = Yii::$app->basePath . '/uploads/batam/';
   Yii::$app->params['uploadUrl'] = Yii::$app->urlManager->baseUrl . '/uploads/batam/';
    }

 public function rules()
    {
        return [
            [['title', 'content'], 'required'],
            [['content'], 'string'],
            [['created_at', 'updated_at','image'], 'safe'],
            [['image'], 'file','extensions'=>'jpg,png,jpeg'],
            [['title'], 'string', 'max' => 255],
        ];
    }

    public function getImageFile() 
    {
        return isset($this->image) ? Yii::$app->params['uploadPath'].$this->image : null;
    }

  public function uploadImage() {
     $image = UploadedFile::getInstance($this, 'image');
     if (empty($image)) {
            return false;
     }
     $this->image = $image->name;
        return $image;
     }

This is my controller

    public function actionCreate()
    {
        $model = new News();
        if ($model->load(Yii::$app->request->post()) )
         {
           // process uploaded image file instance                    
            $image = $model->uploadImage();
                if($model->validate())
                {
                    if($model->save())
                        { 
                        // upload only if valid uploaded file instance found
                        if ($image !== false) 
                            {
                                $path = $model->getImageFile();
                                $image->saveAs($path);
                            }
                             return $this->redirect(['view', 'id'=>$model->id]);
                        }
                }
                        else{echo " validation is failed";}
         } 
        else{   
                     return $this->render('create', [
                    'model' => $model,
                         ]);
            }
    }

This is the form

echo $form->field($model, 'image')->widget(FileInput::classname(), [
    'options' => ['accept' => 'image/*'],
    'pluginOptions' => [['previewFileType' => 'any']]
]);

I had included the enctype also at the beginning of the form <?php $form = ActiveForm::begin(['options' => ['enctype' => 'multipart/form-data']]);

At this point inside the if ($image !== false) part of the controller , the $image and $path to be saved-as contains a seemingly correct path.

This is my $path : C:\xampp\htdocs\gbia/uploads/batam/test image 1-01.jpg and my $image also contain the object (not null). This is the var_dump of my $image :

object(yii\web\UploadedFile)#179 (5) { ["name"]=> string(19) "test image 1-01.jpg" ["tempName"]=> string(24) "C:\xampp\tmp\php3199.tmp" ["type"]=> string(10) "image/jpeg" ["size"]=> int(925184) ["error"]=> int(0) }

I think something wrong with the saveAs(), but I can't figure it out. Had googled around, look on stackoverflow and tutorials but I still can't find any answer. Can someone help? Thanks

Upvotes: 1

Views: 579

Answers (1)

Josep Vidal
Josep Vidal

Reputation: 2661

Check your model, you have declared $image as a public variable of the class, and not as a field in the database, if you want to store the data there, it will never work, as the public property that is temporary will have preference over the database column.

public $image;

So delete this field (If it is also in the db) or generate a new column name (I suggest by the name of path).

[['content', 'path'], 'string'],

Then you need to store the path, I don't see where are you doing that in the controller or class. I suggest you to add a field in the database with the "path" name and then do like this in the controller:

$path = $model->getImageFile();
$image->saveAs($path);
$model->path = $path . $image // You must store the full path plus the file name
$model->save(); // then you save the model again

Any doubt is welcome, I have example projects that I can show you if you are unable to see the light.

Upvotes: 2

Related Questions