【问题标题】:Server Side file validation Don't work in Yii.2.0服务器端文件验证不适用于 Yii.2.0
【发布时间】:2015-10-06 16:41:44
【问题描述】:

Yii2 中的FileValidator 类是否只支持客户端验证?

我用代码写了文件上传系统:

在模型中:

 public function rules() {
    return [


        [['allAllowedFileType'], 'safe'],

        [['allAllowedFileType'], 'file',
            'extensions'=>'jpg',
            'mimeTypes' => 'image/jpeg'],

    ];
}

在控制器中:

 public function actionCreate() {
    $model = new File();
    if ($model->load(Yii::$app->request->post())) {
        // get the uploaded file instance. for multiple file uploads
        // the following data will return an array
       $image = UploadedFile::getInstance($model, 'allAllowedFileType');
        // store the source file name
        $model->name = $image->name;
        $ext = end((explode(".", $image->name)));

        // generate a unique file name
        $avatar = Yii::$app->security->generateRandomString().".{$ext}";


        $path = 'c:wamp/www/' . $avatar;
        if($model->validate()&&$model->save(0)){
            $image->saveAs($path);
            return $this->redirect(['view', 'id'=>$model->id]);
        } else {
            // error in saving model
        }
    }
    return $this->render('create', [
        'model'=>$model,
    ]);
}

在视图中:

<?php
$form = ActiveForm::begin(['enableClientValidation' => true,
            'options' => ['enctype' => 'multipart/form-data'] // important
]);

echo $form->field($model, "allAllowedFileType")->fileInput();

?>

加载无效文件(例如.php扩展的文件)时。 仅完成客户端验证。

一旦表格设置如下:

    $form = ActiveForm::begin(['enableClientValidation' => false,
            'options' => ['enctype' => 'multipart/form-data'] // important
]);

没有给出错误消息,文件不会被服务器端验证。

我也尝试将变量 ($model-&gt;allAllowedFileType) 设置如下:

$model->allAllowedFileType=$_FILES['File'];

我上传了无效文件,例如.exe扩展的文件)并执行验证功能,错误信息不会显示。$model-&gt;errors为空。

public function actionCreate() {
    $model = new File();
    if ($model->load(Yii::$app->request->post())) {


       $image = UploadedFile::getInstance($model, 'allAllowedFileType');

      ...

       $model->allAllowedFileType=$_FILES['File'];

        if($model->validate()){

           //save file

        } else {

             die(var_dump($model->errors));
        }
    }
    return $this->render('create', [
        'model'=>$model,
    ]);
}

【问题讨论】:

    标签: php file validation yii2


    【解决方案1】:

    尝试将'skipOnEmpty' =&gt; falsecheckExtensionByMimeType 添加到您的规则中。

    [['allAllowedFileType'], 'file', 'skipOnEmpty' => false, 'extensions' => 'jpg', 'checkExtensionByMimeType' => true],
    

    至少我在我没有禁用客户端验证的表单中运行了这个。 不确定您是否启用了所有必需的 php 扩展 fileinfo 是必需的。

    http://www.yiiframework.com/doc-2.0/yii-validators-filevalidator.html

    【讨论】:

      【解决方案2】:

      我找到了解决办法。

      与yii2有点区别,yii1上传文件:

      您已设置如下:

      旧代码: 使用此代码 $model->allAllowedfileType 未设置且 $model->validate() 不起作用。

                 $image = UploadedFile::getInstance($model, 'allAllowedfileType ');
      

      替换为:(使用此代码设置 $model->allAllowedfileType 和 $model->validate() 工作。)

                  $model->allAllowedFileType = UploadedFile::getInstance($model, 'allAllowedFileType');
      

      我希望它有用。:)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-02-26
        • 1970-01-01
        相关资源
        最近更新 更多