获得'不能空白'因为'文件'而在save()上出错验证规则

时间:2015-12-08 12:38:57

标签: php validation file-upload yii2

当需要图像文件时出现此错误:" 预览不能为空"。虽然我填补了这个领域。

我的规则:

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文件夹中。

2 个答案:

答案 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()检查。