无法在Yii2中可靠地上传文件

时间:2016-01-25 03:35:41

标签: yii2

我得到了这个用于上传文件的方法,但有时它会在没有实例化$ this-> imageFile的情况下这样做。我不明白为什么。

public function upload()
{

    $path = Url::to('@webroot/images/photos/');
    $filename = strtolower($this->username) . '.jpg';
    $this->imageFile->saveAs($path . $filename);


    return true;

}

我在beforeSave()中调用方法upload(),如下所示:

public function beforeSave($insert)
{

    if(parent::beforeSave($insert)){

        if($this->isNewRecord)
        {
            $this->password = Yii::$app->security->generatePasswordHash($this->password);
        }

        $this->upload();
        return true;
    }
    else
    {
        return false;
    }
}

我把这种方法调用了100次,结果好坏参半。我不知道为什么这个方法调用没有给出相同的结果。它应该永远不会工作或始终有效,但由于某种原因,代码根本不具有确定性。

public function actionCreate()
{
    $model = new Member();
    $model->imageFile = UploadedFile::getInstance($model, 'imageFile');


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


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

另一件事,当我使用这段代码时,我得到一个文件,但用户名是空白的,所以我得到一个没有名字的.jpeg文件。

public function actionCreate()
{
    $model = new Member();
    $model->imageFile = UploadedFile::getInstance($model, 'imageFile');
    $model->upload(); 


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


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

1 个答案:

答案 0 :(得分:1)

<?php
if ($model->load(Yii::$app->request->post()) && $model->save()) {

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

在If子句中,您将重定向到视图,$model自然地在请求之间消失。但是在其他情况下,您发送$model直接查看。它看起来像有缺陷的部分。

另一个,当您将$model->upload()移动到actionCreate时,您将它放在If语句之前,但是您正在if子句中将该帖子加载到模型中,所以当然用户当然没有加载正在尝试上传。

如果您希望将$model->upload()发送到操作,请确保在上传之前调用以下方法。 $model->load(Yii::$app->request->post())