2018-01-03 20:28:56 3207次浏览 2条回答 0 悬赏 10 金钱

使用Bootstrap fileInput扩展上传图片,在model的rules定义了空值验证( 'skipOnEmpty' => false),上传图片后,文件有按新文件名上传至服务器,但文件名未写入数据库,且返回视图引发空值验证规则(如图一)
dd.png

请教哪位大神,controller是哪里逻辑有问题,还是该怎么做好!

Controller文件
public function actionImage($id)

{
    $model = $this->findModel($id);
    $rootPath = "uploads/UserIdImage/";    //定义上传的根目录
    $oldFile = $rootPath . $model->image; //保存旧头像路径与文件名,上传新的文件后删除用

    if (Yii::$app->request->isPost) {
        $model->image = UploadedFile::getInstance($model, 'image');

        if ($model->image && $model->validate()) {
            $ext = $model->image->extension;
            $randName = "userid" . time() . rand(1000, 9999) . "." . $ext;
            $model->image->saveAs($rootPath . $randName);
            $model->image = $randName;
            unlink($oldFile);
            $model->save();
        }
    }
    return $this->render('image', ['model' => $model]);
}

Model文件
public function rules()

{
    return [
        ['status', 'default', 'value' => self::STATUS_ACTIVE],
        ['status', 'in', 'range' => [self::STATUS_ACTIVE, self::STATUS_DELETED]],
        [['email'], 'unique'],
        [['email'], 'required'],
        [['email'], 'email'],
        [['image'], 'file', 'maxSize' => 1024 * 1024, 'skipOnEmpty' => false],
    ];
}

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

<?= $form->field($model, 'image')->widget(FileInput::classname(), [

'options' => ['accept' => 'image/*'],

]);
?>

<?= Html::submitButton('上传', ['class' => 'btn btn-primary']) ?>

<?php ActiveForm::end() ?>

补充于 2018-01-05 17:07

好的,我试试,谢谢

  • 回答于 2018-01-04 23:50 举报

    那可能是$model->save()未成功,最好判断下,没成功可以通过$model->getErrors()获取下错误信息。

    1 条回复
    回复于 2018-01-05 17:08 回复

    好的,我试试,谢谢

  • 回答于 2018-01-15 16:12 举报

    你这个问题有个很好的解决方法就是上传图片是一个单独的控制器,比如点击上传图片后,他会给这个input付上一个图片地址的url,而不是一个fileinput,判定字符处理更好,之后那个单独的上传方法里面去上做上传逻辑,这样可以集中管理上传操作,这对与比如阿里云的OSS还是更换一些上传的云都很方便 这里你可以看看github https://github.com/bailangzhan/yii2-webuploader 这里说的是缩略图,还有一个就是编辑内容的图片上传,比如单上传还是多图上传,原理一样。

    另一个方案就是你定义rule是不为空。
    第一次添加不为空会提示,关健再update时,他会给这个image付上空字符串
    这里处理也是多种方式,比如你可以直接在控制器里给保存前给一个$oldimage付一个值,之后再判定有没有上传文件,没有就把这个老的图片保留重新付给 $model->image

    这是在控制器里操作的,你还可以把他简化到 Model里,复写save()方法,判定getIsNewRecord是就是插入,否就是更新,再把处理图片的逻辑写在这。

    代码就不写了,主要写逻辑思路。

您需要登录后才可以回答。登录 | 立即注册
marine0516
职场新人

marine0516

注册时间:2017-12-13
最后登录:2018-01-07
在线时长:5小时27分
  • 粉丝0
  • 金钱15
  • 威望0
  • 积分65

热门问题