Yii验证文件上传失败

时间:2013-07-23 02:41:15

标签: validation file-upload yii

我在Yii中看到了一些奇怪的行为。

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

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

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));
}

1 个答案:

答案 0 :(得分:1)

对于您在,name之间的第一条规则中遗漏file的人。然后你说:

  

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

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

因此,如果您修复上面的拼写错误,您至少会获得name属性的AJAX验证。

您也可以删除'on'=>'insert'方案。而且您不需要'safe'=>true,因为您没有使用$model->file属性进行大量分配。