【问题标题】:Yii 2 How add a custom validation check on file uploadYii 2 如何在文件上传时添加自定义验证检查
【发布时间】:2018-02-20 15:53:36
【问题描述】:

我正在构建一个 CSV 上传器,我想添加一个自定义验证功能,该功能将检查 CSV 文件的标题行以确保正确的列到位。

我正在尝试在模型中添加自定义验证规则来执行此操作,但在第一个障碍中失败了。

我来了

设置未知属性:yii\validators\FileValidator::0

例外,但据我从文档中可以看出,这应该可以工作。

Model

/**
* UploadForm is the model behind the upload form.
*/
class UploadForm extends Model
{
/**
 * @var UploadedFile file attribute
 */
public $file;

/**
 * @return array the validation rules.
 */
public function rules()
{
    return [
        [['file'], 'file', 'extensions' => 'csv', 'checkExtensionByMimeType'=>false, 'headerCheck', 'skipOnEmpty' => false]
    ];
}

public function attributeLabels(){
    return [
        'file'=>'Select csv'
    ];
}

 function headerCheck($attribute, $params, $validato){

    $this->addError($attribute, "error");
}
}

Controller功能:

     public function actionUpload()
{
    $model = new UploadForm();

    if (Yii::$app->request->isPost) {
        $model->file = UploadedFile::getInstance($model, 'file');
        $filename = $model->file->baseName . '.' . $model->file->extension;

        if ($model->file && $model->validate()) {
            $upload = $model->file->saveAs('uploads/'.$filename );

            if($upload){
                define('CSV_PATH','uploads/');
                $csv_file = CSV_PATH . $filename;
                $filecsv = file($csv_file);

                foreach($filecsv as $data){
                    $lines = explode(',',$data);
                    $t=1;
                }
            }
        }
    }

    return $this->render('csvUpload', ['model' => $model]);
}

View

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

<?= $form->field($model, 'file')->fileInput() ?>

<button>Submit</button>

<?php ActiveForm::end() ?>

为什么headerCheck() 没有被用作自定义验证函数?

【问题讨论】:

    标签: php yii yii2 yii2-basic-app yii-components


    【解决方案1】:

    简答

    你的规则应该这样写:

    return [
        [['file'], 'file', 'extensions' => 'csv', 'checkExtensionByMimeType'=>false, 'skipOnEmpty' => false],
        [["file"], "headerCheck"],
    ];
    

    请注意,您的验证规则“headerCheck”是数组中的一个单独项目。

    长答案

    规则的结构是这样的:

    [["attributes_to_validate"],"vaildatorCallback","param1"=>"value","param2"=>"value]
    

    注意前两项分别是属性和回调,然后你可以指定应该分配给验证器的参数,或者传递给你的验证器回调。这些参数的形式应该是键是属性的名称,值是要分配给属性的值。

    在您提供的示例中,Yii 看到您想要使用“文件”验证器,因此它创建了一个 yii\validators\FileValidator 的实例。然后它会看到您希望将参数“extensions”设置为“csv”,所以它会这样做:yii\validators\FileValidator::$extensions = "csv"; 但是,由于您在数组的这一部分中包含了自定义验证器,它认为“headerCheck”实际上是要分配给验证器的属性的值。因为你在没有键的情况下输入了这个“参数”,所以键默认为 0,所以 Yii 认为你要分配的属性称为 '0'。因此,Yii 尝试这样做:yii\validators\FileValidator::0 = "headerCheck";

    当然,FileValidator 上没有属性“0”,所以这就是你得到的错误的来源。

    【讨论】:

      猜你喜欢
      • 2023-03-30
      • 1970-01-01
      • 2018-07-28
      • 2015-10-04
      • 2019-07-11
      • 1970-01-01
      • 1970-01-01
      • 2017-09-02
      • 1970-01-01
      相关资源
      最近更新 更多