0

在 Yii 中,我有一些奇怪的行为。

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

如果我只是提交没有名称或文件的表单,我可以绕过验证(即 - 我的控制器操作被调用并正在尝试处理上传的文件)我认为我的 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));
}
4

2 回答 2

1

对于一个人,您在and,之间的第一条规则中缺少 a 。然后你说:namefile

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

我假设您使用 AJAX 验证并期望上传失败。但是您不能对使用CActiveForm.

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

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

于 2013-07-23T05:47:51.083 回答
0

对我来说,我发现如果我在处理上传的文件之前进行验证,它就可以工作。不太清楚为什么我必须这样做,因为我认为 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

于 2013-07-27T19:10:58.517 回答