【问题标题】:Yii2 File Validation Not Working After UploadYii2 文件验证在上传后不起作用
【发布时间】:2015-10-18 04:45:37
【问题描述】:

我不确定这是一个新错误还是发生了什么,但我无法让 Yii2 验证器识别上传后的文件。客户端验证工作正常。

模型规则:

return [
        [['store_id', 'name', 'csv'], 'required'],
        [['store_id', 'created_at', 'updated_at'], 'integer'],
        [['name'], 'string', 'max' => 255],
        [['csv'], 'file', 'skipOnEmpty' => false, 'maxSize'=>1024 * 1024 * 2],
    ];

控制器动作:

public function actionUploadFromCsv()
{
    $store = Yii::$app->user->identity->store;

    $store_csv = new StoreCsv;
    $store_csv->store_id = $store->id;
    $store_csv->name = $store_csv->getDefaultName();

    if (Yii::$app->request->isPost) {
        $store_csv->csv = UploadedFile::getInstance($store_csv, 'csv');
        if ($store_csv->upload()) {
            return $this->redirect(['view-csv', 'id'=>$store_csv->id]);
        }
        return json_encode($store_csv->getErrors());
    }
    return $this->render('csv_upload', [
        'store'=>$store,
        'csv'=>$store_csv
    ]);
}

模型上传()函数:

public function upload()
{
    if ($this->validate()) {
        $file_name = uniqid(rand(), false) . '.' . $this->csv->extension;
        $this->csv->saveAs(Yii::getAlias('@backend') . '/web/store/' . $this->store_id . '/csv/' . $file_name);
        $this->csv = $file_name;
        return $this->save();
    }
    return false;
}

表单标记:

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

    <div class="form-group">
        <?= Html::submitButton('Submit', ['class' => 'btn btn-primary']) ?>
    </div>

<?php ActiveForm::end(); ?>

目前,当我执行上传时,验证失败后出现此错误:

{"csv":["Please upload a file."]}

但是,如果我将“skipOnEmpty”更改为 true,它可以正常工作。它保存模型并移动和重命名临时文件。不过我想让验证工作,所以我可以限制某些扩展。这是怎么回事?我花了几个小时解决这个问题。

【问题讨论】:

    标签: file-upload yii2


    【解决方案1】:

    我发现了我的问题所在。保存文件后,我尝试重命名它,但是,我在此处执行此操作的方式取消了此属性作为文件的关联。

    错误:

    $this->csv = $file_name;
    

    右:

    $this->csv->name = $file_name;
    

    此外,我最初问这个问题是因为我无法让验证器工作,限制扩展。当我执行 $model->validate() 时,它在客户端验证后无法识别“xls”或“csv”。由于 MIME TYPE 验证器,我刚刚发现这是一个已知问题: https://github.com/yiisoft/yii2/issues/6148

    扩展问题的解决方法是将checkExtensionByMimeType设置为false:

    [['csv'], 'file', 'skipOnEmpty' => false, 'extensions'=>['xls', 'csv'], 'checkExtensionByMimeType'=>false, 'maxSize'=>1024 * 1024 * 2],
    

    【讨论】:

    • 感谢有关 checkExtensionsByMimeType 的建议。我为此苦苦挣扎。
    【解决方案2】:

    您的 FORM 标记是什么?在浏览器中查看页面源代码。除非表单标记具有 multipart/form-data,否则文件将被忽略。

    <form action="upload.php" method="post" enctype="multipart/form-data">
    

    【讨论】:

    • 我添加了它。另外,如果您阅读了底部段落,如果我有 'skipOnEmpty'=>true 则所有内容都可以正常上传和保存。
    • Yii2 在表单有文件输入时自动添加 enctype 属性。
    猜你喜欢
    • 1970-01-01
    • 2018-02-11
    • 2018-03-28
    • 1970-01-01
    • 1970-01-01
    • 2014-12-24
    • 2015-12-20
    • 2015-06-14
    • 1970-01-01
    相关资源
    最近更新 更多