在Yii2文件上传中`空时跳过'不工作

ezykj2lf  于 2022-11-09  发布在  其他
关注(0)|答案(2)|浏览(113)

我有一个条款,为公司在我的应用程序上传标志。上传和保存创建配置文件的工作正常。但在更新,标志去空,如果我不上传它了!
这是我的更新表

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

       .....

       <?= $form->field($model, 'logo')->fileInput() ?>

       ...

我的控制器操作

if ($model->load($_POST) ) {
    $file = \yii\web\UploadedFile::getInstance($model, 'logo');
    if($file){
    $model->logo=$file; }

    if($model->save()){

        if($file)
        $file->saveAs(\Yii::$app->basePath . '/web/images/'.$file);
        }

            return $this->redirect(['profile']);
        } else {
            return $this->renderPartial('update', [
                'model' => $model,
            ]);
        }

我的规则:

public function rules()
{
    return [

        [['logo'], 'image', 'extensions' => 'jpg,png', 'skipOnEmpty' => true],
        [['name'], 'required'],
        [['name', 'description'], 'string'],

    ];
}

有什么想法吗????

8hhllhi2

8hhllhi21#

skipOnEmpty不适用于此处,因为在更新操作中,$model->logo属性不会为空,它将是一个带有文件名的字符串。$file仍然是一个只有键的数组,但如果不再次上载,则没有值。因此检查$file->size,而不是检查!empty($file)。通过修改控制器代码修复了此问题,如下所示!

$model = $this->findModel($id);
    $current_image = $model->featured_image;
    if ($model->load(Yii::$app->request->post())) {         
        $image= UploadedFile::getInstance($model, 'featured_image');
        if(!empty($image) && $image->size !== 0) {
            //print_R($image);die;
            $image->saveAs('uploads/' . $image->baseName . '.' .$image->extension);
            $model->featured_image = 'uploads/'.$image->baseName.'.'.$image->extension; 
        }
        else
            $model->featured_image = $current_image;
        $model->save();
        return $this->redirect(['update', 'id' => $model->module_id]);
    } else {
        return $this->render('add', [
            'model' => $model,
        ]);
    }
pjngdqdw

pjngdqdw2#

'skipOnEmpty' => !$this->isNewRecord

对于更新,可以跳过。

相关问题