【问题标题】:yii2 file upload error- Call to a member function saveAs() on nullyii2 文件上传错误 - 在 null 上调用成员函数 saveAs()
【发布时间】:2021-05-07 09:06:29
【问题描述】:

我对 yii2 框架有一些了解,但是我遇到了一个我无法解决的错误。我正在尝试将图像添加到注册表单。

查看:

            <?php $form = ActiveForm::begin(['id' => 'form-signup', 'options' => ['enctype' => 'multipart/form-data']]); ?>
        
            <?= $form->field($model, 'voornaam')->textInput(['autofocus' => true]) ?>
            <?= $form->field($model, 'bedrijf') ?>
            <?= $form->field($model, 'telefoon') ?>
            <?= $form->field($model, 'username')?>
            <?= $form->field($model, 'email') ?>
            <?= $form->field($model, 'password')->passwordInput() ?>
            <?= $form->field($model, 'file')->fileInput() ?>

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

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

控制器

public function actionSignup()
{
    $model = new SignupForm();
    if ($model->load(Yii::$app->request->post())) {
        if ($user = $model->signup()) {
            if (Yii::$app->getUser()->login($user)) {
                return $this->goHome();
            }
        }
    }

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

型号:

public function signup()
{
    if (!$this->validate()) {
        return null;
    }
    
    $user = new User();
    
            $imageName = $user->username;
            $user->file = UploadedFile::getInstance($user,'file');
            $user->file->saveAs( 'uploads/'.$imageName.'.'.$model->file->extension );
            $user->picture =  'uploads/'.$imageName.'.'.$model->file->extension; 
            
    $user->voornaam = $this->voornaam;
    $user->bedrijf = $this->bedrijf;
    $user->telefoon = $this->telefoon;
    $user->username = $this->username;
    $user->email = $this->email;
    $user->setPassword($this->password);
    $user->generateAuthKey();
    
    return $user->save() ? $user : null;
}

我收到了错误:

在 null 上调用成员函数 saveAs()

我做错了什么? (我使用的是高级模板)。

【问题讨论】:

    标签: yii2 yii2-advanced-app


    【解决方案1】:

    你应该使用$this而不是$user或者你应该添加

    $user=$this
    

    因为只是 $user 是新实例并且它的字段是空的!

    【讨论】:

    • 谢谢,这成功了!但它给出了下一个错误: Calling unknown method: yii\web\UploadedFile::save() 我正在使用 yii 本身的供应商扩展使用 yii\web\UploadedFile;我的保存行:$this->file->save();
    • 我认为你应该使用 saveAs();
    • 我设法让它工作,我所做的是,从 $this 到 $user 的最后一行,最后它保存了用户的注册。 $user->picture = 'uploads/'.$imageName.'.'.$this->file->extension;
    【解决方案2】:

    您似乎提到了错误的文件路径,您必须提及根路径才能保存功能 例如

       $user->file->saveAs(\Yii::getAlias('@webroot').'/uploads/'.$imageName.'.'.$model->file->extension );
    

    【讨论】:

    • 我用你的替换了该行,并在根目录中创建了一个上传文件夹,但仍然没有工作并且同样的错误..
    【解决方案3】:

    我使用单独的上传功能来上传文件,并且可以正常工作。

    我的看法

     <?php $form = ActiveForm::begin(['id' => 'form-signup','options' => ['enctype' => 'multipart/form-data']]); ?>
    
                <?= $form->field($model, 'username') ?>
    
                <?= $form->field($model, 'email') ?>
    
                <?= $form->field($model, 'password')->passwordInput() ?>
    
                <?= $form->field($model, "files")->fileInput() ?>
    
                <div class="form-group">
                    <?= Html::submitButton('Signup', ['class' => 'btn btn-primary', 'name' => 'signup-button']) ?>
                </div>
    
            <?php ActiveForm::end(); ?>
    

    控制器

    public function actionSignup() {
            $model = new SignupForm();
            if ($model->load(Yii::$app->request->post())) {
                $model->files = \yii\web\UploadedFile::getInstance($model,'files');
    
                if ($model->upload() && $user = $model->signup()) {
                    if (Yii::$app->getUser()->login($user)) {
                        return $this->goHome();
                    }
                }
            }
    
            return $this->render('signup', [
                        'model' => $model,
            ]);
        }
    

    我的模型是

    //declare variable
    public $files; 
    
    //add this to your rules
    [['files'], 'file', 'skipOnEmpty' => false, 'extensions' => 'png, jpg, jpeg']
    
    
    //File upload function
    public function upload()
        {
            if ($this->validate()) {
                $this->files->saveAs('../web/uploads/' . $this->files->baseName. '.' .$this->files->extension);
                $this->picture = '../web/uploads/' . $this->files->baseName. '.' .$this->files->extension;
                return true;
            } else {
                return false; 
            }
        }
    
    
        public function signup()
        {
                $user = new User();
                $user->username = $this->username;
                $user->email = $this->email;  
                $user->picture = $this->picture;
                $user->setPassword($this->password);
                $user->generateAuthKey();
                if ($user->save()) {
                    return $user;
                }
                else{
                    return null;
                }
    
        }
    

    【讨论】:

      【解决方案4】:

      只是分享你我的解决方案,将上传文件夹的路径更改为../uploads/

      在您的模型中尝试更改saveAs 函数,如下所示

      $user->file->saveAs( '../uploads/'.$imageName.'.'.$model->file->extension );
      

      我是 yii2 的初学者,我在尝试文件上传代码时遇到了问题 https://www.yiiframework.com/doc/guide/2.0/en/input-file-upload,

      这解决了我的问题

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-14
        • 2020-01-19
        • 2017-09-14
        • 2017-06-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多