【问题标题】:Yii validation with file upload failing文件上传失败的 Yii 验证
【发布时间】:2013-07-23 02:41:14
【问题描述】:

我在 Yii 中发现了一些奇怪的行为。

我有一个简单的文件上传,需要 name 和文件本身。

如果我只是提交没有名称或文件的表单,我可以绕过验证(即 - 我的控制器操作被调用并正在尝试处理上传的文件)我认为我的 rules() 已相应设置以阻止此操作。这些是我的相关规则:

public function rules() {
    return array(
        array('name file', 'required', 'message' => 'This field is required'), 
        array('file', 'file', 'on' => 'insert', 'allowEmpty' => false, 'safe'=>true,
            'maxSize'=> 512000, 
            'maxFiles'=> 1, 
            'mimeTypes' => 'application/msword, text/plain',
            'tooLarge'=> 'file cannot be larger than 500KB.',
            'wrongMimeType'=> 'Format must be: .doc .txt'
        ),

我指定了该文件是必需的,并且在文件数组中也指定了 allowEmpty 应该为 false。那么我在这里做错了什么?

提前感谢您的帮助

控制器

public function actionCreate() {

    $model = new File;

    if (isset($_POST['File'])) {

        $model->setAttributes($_POST['File']);

        // Set file
        $model->file = CUploadedFile::getInstance($model,'file');

        // Set directory
        $dest = Yii::getPathOfAlias('application.uploads');

        $model->tmp_name = time();
        $model->date_added = new CDbExpression('NOW()');
        $model->file_type = $model->file->type;
        $model->file_size = $model->file->size;
        $model->extension = $model->file->extensionName;


        if ($model->save()) {

            $model->file->saveAs(($dest . '/' . $model->tmp_name . '.' . $model->file->extensionName));

             Yii::app()->user->setFlash('success','<strong>Success!</strong> Your file has been uploaded');


        }
    }

    $this->render('create', array( 'model' => $model));
}

【问题讨论】:

  • 请将控制器操作代码添加到您的问题中。

标签: validation file-upload yii


【解决方案1】:

如果您在namefile 之间的第一条规则中缺少,。然后你说:

我可以绕过验证(即 - 我的控制器操作被调用...

据此,我假设您使用 AJAX 验证并期望上传失败。但是您不能使用 CActiveForm 对文件上传进行 AJAX 验证。

所以如果你修正了上面的错字,你至少会得到 name 属性的 AJAX 验证。

您也许还应该删除'on'=&gt;'insert' 场景。而且您不需要'safe'=&gt;true,因为您不需要使用$model-&gt;file 属性进行大量分配。

【讨论】:

  • 谢谢,我确实错过了,。不,我的表单实际上有 'enableAjaxValidation' => false。如果我添加要上传的文件并将name 留空并提交,我会收到一条错误消息,指出需要name。如果我填写name 并将文件留空,它不会发生,它只是尝试处理表单。 (更新)控制器) - 谢谢
  • 嗯。更新了答案。见最后两句。
  • 还是一样的结果。
【解决方案2】:

对我来说,我发现如果我在处理上传的文件之前进行验证,它就可以工作。不太清楚为什么我必须这样做,因为我认为 save() 方法会自动调用 validate() 方法

Validation will be performed before saving the record. If the validation fails, the record will not be saved. You can call getErrors() to retrieve the validation errors.

更新代码

public function actionCreate() {

    $model = new File;

    if (isset($_POST['File'])) {

        $model->setAttributes($_POST['File']);

    if($model->validate()){ // add in validation call

        // Set file
        $model->file = CUploadedFile::getInstance($model,'file');

        // Set directory
        $dest = Yii::getPathOfAlias('application.uploads');

        $model->tmp_name = time();
        $model->date_added = new CDbExpression('NOW()');
        $model->file_type = $model->file->type;
        $model->file_size = $model->file->size;
        $model->extension = $model->file->extensionName;


        if ($model->save()) {

            $model->file->saveAs(($dest . '/' . $model->tmp_name . '.' . $model->file->extensionName));

             Yii::app()->user->setFlash('success','<strong>Success!</strong> Your file has been uploaded');


            }
        }
    }

    $this->render('create', array( 'model' => $model));
}

希望对任何人都有帮助,也感谢@Michael Härtl

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多