使用Bootstrap fileInput上传图片,引用空值规则导致数据未写入数据库与规则错误问题 [ 2.0 版本 ]
使用Bootstrap fileInput扩展上传图片,在model的rules定义了空值验证( 'skipOnEmpty' => false),上传图片后,文件有按新文件名上传至服务器,但文件名未写入数据库,且返回视图引发空值验证规则(如图一)
请教哪位大神,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/*'],
]);
?>
<?php ActiveForm::end() ?>
好的,我试试,谢谢
共 2 个回答
-
那可能是
$model->save()
未成功,最好判断下,没成功可以通过$model->getErrors()
获取下错误信息。共 1 条回复marine0516 回复于 2018-01-05 17:08 回复好的,我试试,谢谢
-
你这个问题有个很好的解决方法就是上传图片是一个单独的控制器,比如点击上传图片后,他会给这个input付上一个图片地址的url,而不是一个fileinput,判定字符处理更好,之后那个单独的上传方法里面去上做上传逻辑,这样可以集中管理上传操作,这对与比如阿里云的OSS还是更换一些上传的云都很方便 这里你可以看看github https://github.com/bailangzhan/yii2-webuploader 这里说的是缩略图,还有一个就是编辑内容的图片上传,比如单上传还是多图上传,原理一样。
另一个方案就是你定义rule是不为空。
第一次添加不为空会提示,关健再update时,他会给这个image付上空字符串
这里处理也是多种方式,比如你可以直接在控制器里给保存前给一个$oldimage付一个值,之后再判定有没有上传文件,没有就把这个老的图片保留重新付给 $model->image这是在控制器里操作的,你还可以把他简化到 Model里,复写save()方法,判定getIsNewRecord是就是插入,否就是更新,再把处理图片的逻辑写在这。
代码就不写了,主要写逻辑思路。
marine0516
最后登录:2018-01-07
在线时长:5小时27分
- 粉丝0
- 金钱15
- 威望0
- 积分65