服务器端文件验证在Yii.2.0中不起作用 [英] Server Side file validation Don't work in Yii.2.0

查看:200
本文介绍了服务器端文件验证在Yii.2.0中不起作用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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



我用文件上传系统使用代码:

在模型中:
$ b $ pre $ public function rules( ){
return [

$ b $ [['allAllowedFileType'],'safe'],

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

];



$ b $在控制器中:

$ b pre> public function actionCreate(){
$ model = new File();
if($ model-> load(Yii :: $ app-> request-> post())){
//获取上传的文件实例。对于多个文件上传
//下面的数据将返回一个数组
$ image = UploadedFile :: getInstance($ model,'allAllowedFileType');
//存储源文件名
$ model-> name = $ image-> name;
$ ext = end((explode(。,$ image-> name)));
$ b $ //生成一个唯一的文件名
$ avatar = Yii :: $ app-> security-> generateRandomString()。。{$ ext};


$ path ='c:wamp / www /'。 $化身;
if($ model-> validate()&& $ model-> save(0)){
$ image-> saveAs($ path);
return $ this-> redirect(['view','id'=> $ model-> id]);
} else {
//保存模型中的错误
}
}
return $ this-> render('create',[
'model '=> $ model,
]);



$ b $ p


$ b



< pre $ <?php
$ form = ActiveForm :: begin(['enableClientValidation'=> true,
'options'=> ['enctype' =>'multipart / form-data'] //重要
]);
$ b $ echo $ form-> field($ model,allAllowedFileType) - > fileInput();

?>

当一个无效文件(例如由 .php extention)被加载。
只有客户端验证完成。

一旦表单设置如下:

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

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



我也尝试设置变量( $ model-> allAllowedFileType ),如下所示:

  $ model-> allAllowedFileType = $ _ FILES ['File']; 

我通过 .exe extention)并执行validate函数,错误消息将不会被显示,并且 $ model->错误为空。

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


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

...

$ model-> allAllowedFileType = $ _ FILES ['File']; ($ model-> validate()){

//保存文件

} else {

die(var_dump($ model-> errors));

$ b $ return $ this-> render('create',[
'model'=> $ model,
]);


解决方案

尝试添加'skipOnEmpty'=>假的也许 checkExtensionByMimeType 到您的规则。

  [[allAllowedFileType]],'file','skipOnEmpty'=>假,扩展=> 'jpg','checkExtensionByMimeType'=>真正的],

至少我有这个在我的窗体运行,我没有禁用客户端验证。
不知道是否启用了所有必需的php扩展

$ b

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


Is the FileValidator class in Yii2 only supports clientside validation ?

I written the file upload system with the use of code :

in model:

 public function rules() {
    return [


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

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

    ];
}

in controller:

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

in view :

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

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

?>

When a invalid file(for example file by .php extention) is loaded . Only client-side validation is done.

Once the form is set as follows:

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

No error message is given and the files will not be Server side validated.

also i tried to set the variable ($model->allAllowedFileType) as follows :

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

I uploaded invalid file for example file by .exe extention) and execute validate function, the error message wont be displayed.and $model->errors is empty.

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

解决方案

Try to add 'skipOnEmpty' => false and maybe checkExtensionByMimeType to your rules.

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

At least i have this running in my form where i haven't disabled client side validation. Not sure if you have enabled all required php extensions fileinfo is required.

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

这篇关于服务器端文件验证在Yii.2.0中不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆