Yii2。上传文件时出错

时间:2016-06-29 18:02:24

标签: php yii upload yii2

我的代码相关如下:

模型规则

[['documentTypeId', 'itemId', 'name', 'document'], 'required'],
            [['document'], 'file', 'skipOnEmpty' => false, 'extensions' => ['png', 'jpg', 'doc', 'pdf'], 'checkExtensionByMimeType'=>false],

模型方法

public function upload($file)
    {
        if ($this->validate()) {
            $userFolder = Yii::getAlias("@app")."/uploads/".$this->item->userId;
            if(BaseFileHelper::createDirectory($userFolder) !== false) {
                $fileName = uniqid(rand(), false) . '.' . $this->document->extension;
                $file->saveAs($userFolder.'/' . $fileName);

                $this->document = $file->name;

                return true;
            } else {
                return false;
            }

        } else {
            return false;
        }
    }

控制器

$model = new ItemDocument();

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

            $file = UploadedFile::getInstance($model, 'document');

            if($model->upload($file) !== false) {
                $model->save();
            }

            return $this->redirect(['view', 'id' => $model->id]);
        }



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

这给了我一个验证错误:"文档不能为空白"。如果我设置" Document"字段为不需要并提交表单我得到"请上传文件。"

我通过一个包含其他字段的表单上传。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

我在控制器上发现错误是模型 - > validate()。当我这样做时:

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

文件内容未加载到“文档”字段。 Yii生成一个空的隐藏字段。所以我首先需要这样做:

$file = UploadedFile::getInstance($model, 'document');

所以现在我的控制器看起来像这样:

$model = new ItemDocument();

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

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

            if($model->validate()) {

                if ($model->upload() !== false) {
                    $model->save();
                }

                return $this->redirect(['view', 'id' => $model->id]);
            }
        }

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

我在模型上删除了上传方法中的验证。希望它可以帮到某人。