【问题标题】:Yii2 Image name not saved in database but saved in folderYii2 图像名称未保存在数据库中但保存在文件夹中
【发布时间】:2016-05-18 06:01:19
【问题描述】:

我想上传一张图片。但是图片名称并没有保存在数据库中,而是图片移动到了特定的文件夹中。

但是没有显示错误

在我的控制器代码中:

            if($model->load(Yii::$app->request->post()) && $model->save()) {
            $image = UploadedFile::getInstance($model,'varImage');

            $imagepath='uploads/';

            $no=rand(0,1000);

            if($image != '')
            {
            // $img_loc = "portfolio_{$rand_name}-{$image}"; 
            $img_loc='portfolio_'.$no.$image;
            $model->varImage = $img_loc;
            }
            if($image != '')
            {           
            $image->saveAs($imagepath.$model->varImage);
            } 
            Yii::$app->getSession()->setFlash('succ', 'Portfolio added successfully');          
            return $this->redirect('view_portfolio');
            }

在我的模型中:

            public function rules()
            {
            return [

            ['varTitle', 'required'],
            [['varImage'], 'image', 'skipOnEmpty' => true],
            ['intOrder', 'required'],
            ['intOrder', 'unique'],
            ['intOrder', 'number'],
            ['intHomepage', 'safe'],


            ];
            }

在我看来:

            <?php 
            $form = ActiveForm::begin([
            //'type' => ActiveForm::TYPE_HORIZONTAL,
            'options' => ['enctype'=>'multipart/form-data']
            ]);

             echo $form->field($model, 'varImage')->fileInput();

             ActiveForm::end();

             ?>

我的代码有什么问题。 请帮我解决这个问题。 谢谢。

【问题讨论】:

  • 在分配图像属性之前保存模型。

标签: yii2


【解决方案1】:

UploadedFile::getInstance 返回 UploadedFile 对象而不是文件名。

$image = UploadedFile::getInstance($model,'varImage');
// after this
// $image->baseName  <--- will have original file base name
// $image->extension <--- will have file extension
// $image->name      <--- will have original full file name

你做错的部分在这里:

$img_loc='portfolio_'.$no.$image;

// do this
$img_loc='portfolio_'.$no.$image->name;

而且你在设置上述值之前保存你的模型

if($model->load(Yii::$app->request->post()) && $model->save()) { // HERE

您需要在处理完图像并设置图像名称后调用$model-&gt;save()

【讨论】:

    【解决方案2】:

    在分配图像属性之前保存模型。

    这样做:

    if ($model->load(Yii::$app->request->post()) && $model->validate()) {
       // your logic here
       $model->varImage = $img_loc;
       $image->saveAs($imagepath.$model->varImage);
       if ($model->save(false)) {
          // on success
       }
    }
    

    【讨论】:

      【解决方案3】:

      如下更改您的上传代码:

       if($model->load(Yii::$app->request->post())) {
                      $image = UploadedFile::getInstance($model,'varImage');
      
                      $imagepath='uploads/';
      
                      $no=rand(0,1000);
      
                      if($image != '')
                      {
                      $img_loc = "portfolio{$no}-{$image}"; 
      
                      $model->varImage = $img_loc;
                      }
                       if($model->save()){
                      if($image)
                      {           
                      $image->saveAs($imagepath.$model->varImage);
                      } 
                  }
                      Yii::$app->getSession()->setFlash('succ', 'Portfolio added successfully');          
                      return $this->redirect('view_portfolio');
                      }
      

      更改图像名称后使用 $model->save()。

      【讨论】:

        猜你喜欢
        • 2017-12-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-05
        • 2021-07-15
        • 2016-04-06
        • 2019-04-10
        相关资源
        最近更新 更多