当需要图像文件时出现此错误:" 预览不能为空"。虽然我填补了这个领域。
我的规则:
public function rules()
{
return [
[['name', 'preview', 'date', 'author_id'], 'required', 'on' => 'update'],
[['name', 'preview', 'date', 'author_id'], 'required', 'on' => 'create'],
[['date_create', 'date_update', 'author_id'], 'integer'],
[['preview'], 'file', 'skipOnEmpty' => 'false', 'extensions' => 'png, jpg, jpeg'],
[['date'], 'safe'],
[['name'], 'string', 'max' => 255]
];
}
控制器:
public function actionCreate()
{
$model = new Book();
$model->scenario = 'create';
if ($model->load(Yii::$app->request->post()) && $model->validate()) {
$model->preview = UploadedFile::getInstance($model, 'preview');
if ($model->save() && $model->preview->saveAs('uploads/' . $model->preview->baseName . '.' . $model->preview->extension))
{
return $this->redirect(['view', 'id' => $model->id]);
}
} else {
return $this->render('create', [
'model' => $model,
]);
}
}
如果不需要preview
文件,则没有错误,文件正被加载到uploads
文件夹中。
答案 0 :(得分:2)
我认为你不能使这个字段成为必需,因为它只验证插入的$ _POST变量。文件上传输入$ _FILES超全局,而不是$ _POST超全局。要求这意味着你需要它在$ _POST变量中。
在处理文件上传之前运行验证。因此,我建议您在处理模型验证之前处理文件上载,这样您就可以将值设置为模型,然后再运行validate:
public function actionCreate()
{
$model = new Book();
$model->load(Yii::$app->request->post());
$model->scenario = 'create';
$model->preview = UploadedFile::getInstance($model, 'preview');
if ($model->validate()) {
if ($model->save() && $model->preview->saveAs('uploads/' . $model->preview->baseName . '.' . $model->preview->extension))
{
return $this->redirect(['view', 'id' => $model->id]);
}
} else {
return $this->render('create', [
'model' => $model,
]);
}
}
我没有在本地测试它,但是进行了预览'没有任何信息所需的字段无法确定。
P.S。我认为应该是' skipOnEmpty' =>是假的,而不是''在假的周围。
答案 1 :(得分:2)
这里最好的办法是避免将相同的字段用于不同的目的。
如果您使用preview
实例覆盖UploadedFile
,则可以为此创建另一个字段,然后:
$model->previewFile = UploadedFile::getInstance($model, 'preview');
然后save()
调用的验证不会触及有关preview
字段的任何新问题,因为该文件保存在previewFile
中且原始值preview
已通过通过$model->validate()
检查。