【问题标题】:Yii2 file validation always shows emptyYii2 文件验证总是显示为空
【发布时间】:2019-12-20 17:30:51
【问题描述】:

我的表单中有一个 Kartik 文件输入,代码如下:

echo $form->field($model, 'images')->widget(FileInput::classname(), [
    'options' => ['accept' => 'image/*','multiple' => true]
]);

我想验证输入以便需要上传图片。为此,我的模型中有以下行:

[['images'], 'file', 'skipOnEmpty' => false, 'extensions' => 'png, jpg,jpeg']

这是我的模型的代码:

<?php

namespace app\models;

use Yii;
use yii\web\UploadedFile;

/**
 * LoginForm is the model behind the login form.
 *
 * @property User|null $user This property is read-only.
 *
 */
class PhonesForm extends \yii\db\ActiveRecord
{
    public $images;

    public static function tableName()
    {
        return '{{phones}}';
    }

    /**
     * @return array the validation rules.
     */ 
    public function rules()
    {
        return [
            [['name', 'price','model','description'], 'required'],
            [['name','model'],'string', 'min' => 3],
            [['description'],'string', 'min' => 25],
            ['price','integer'],
            [['images'], 'file', 'skipOnEmpty' => false, 'extensions' => 'png, jpg,jpeg']
        ];
    }

    public function upload()
    {
        if ($this->validate()) {
            $this->images->saveAs('uploads/' . $this->images->baseName . '.' . $this->images->extension);
            return true;
        } else {
            return false;
        }
    }
}

问题是它总是给我一个验证错误,说Please upload a file.。我该如何解决这个问题?谢谢。

更新

我已经更新了我的控制器方法和模型。

控制器方法:

public function actionAdd()
    {
        if (!Yii::$app->user->getIsGuest() && Yii::$app->user->identity->role == 'admin') {

            $model = new PhonesForm();

            if ($model->load(Yii::$app->request->post())) {

                $model->images = UploadedFile::getInstances($model, 'images');

                if ($model->upload()) {
                    echo "success";
                }
                else{
                    return $this->render('dashboardAdd',[
                        'model' => $model
                    ]);
                }
            }
            else{
                return $this->render('dashboardAdd',[
                    'model' => $model
                ]);
            }   
        }
        else{
            return $this->redirect(['site/index']);
        }
    }

型号:

<?php

namespace app\models;

use Yii;

/**
 * LoginForm is the model behind the login form.
 *
 * @property User|null $user This property is read-only.
 *
 */
class PhonesForm extends \yii\db\ActiveRecord
{
    public $images;

    public static function tableName()
    {
        return '{{phones}}';
    }

    /**
     * @return array the validation rules.
     */ 
    public function rules()
    {
        return [
            [['name', 'price','model','description'], 'required'],
            [['name','model'],'string', 'min' => 3],
            [['description'],'string', 'min' => 25],
            ['price','integer'],
            [['images'], 'file', 'skipOnEmpty' => false, 'extensions' => 'png, jpg,jpeg']
        ];
    }

    public function upload()
    {
        if (!$this->validate()) { 
            return false;
        }
        foreach ($this->images as $image) {
            $image->saveAs('uploads/' . $image->baseName . '.' . $image->extension);
        }
        return true;
    }
}

我还是有同样的问题。

【问题讨论】:

  • 请向我们展示处理文件上传的操作代码。
  • 看起来像这样:public function upload() { if ($this-&gt;validate()) { $this-&gt;images-&gt;saveAs('uploads/' . $this-&gt;images-&gt;baseName . '.' . $this-&gt;imageFile-&gt;extension); return true; } else { return false; } } 但是验证永远不会通过,所以它不起作用。
  • 什么是$this-&gt;imageFile-&gt;extension 它来自哪里不应该是$this-&gt;images-&gt;extension
  • 有人找到解决办法了吗?

标签: php validation file-upload yii2


【解决方案1】:

在验证之前,您必须将上传的文件传递给模型。 例如,您可以在控制器中执行此操作

$model = new PhonesForm();

if (Yii::$app->request->isPost && $model->load(Yii::$app->request->post())) {
    $model->images = UploadedFile::getInstances($model, 'images');
    if ($model->save() && $model->upload()) {
        return;
    }
 }

但是如果你要上传多个文件upload方法必须将文件作为一个数组使用,例如:

public function upload()
{
    if (!$this->validate()) { 
        return false;
    }

    foreach ($this->images as $image) {
        $image->saveAs('uploads/' . $image->baseName . '.' . $image->extension);
    }
    return true;
}

【讨论】:

  • 我正在尝试在名为 PhonesForm 的模型中进行验证和上传。我班上有use yii\web\UploadedFile;。如何为我的PhonesForm 模型执行此操作?
  • @GrigoryVolkov 您可以将您班级的代码附加到答案中吗?
  • 我更新了问题,请你看一下。
猜你喜欢
  • 1970-01-01
  • 2015-04-29
  • 1970-01-01
  • 1970-01-01
  • 2012-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多