在非对象上调用成员函数saveAs()

时间:2017-08-07 20:17:05

标签: yii2

我正在尝试上传图片和数据库表。

在数据库表basic_info字段名称'照片'我想存储文件名。

这是模型

public function rules()
    {
        return [
            [['photo'], 'string', 'max' => 255],
            [['image'], 'safe'],
            [['image'], 'file', 'extensions'=>'jpg, gif, png'],
        ];
    }

这是控制器

 public function actionCreate()
        {
            $model = new BasicInfo();


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

                $model->image = UploadedFile::getInstance($model, 'image');
                $filename = pathinfo($model->image , PATHINFO_FILENAME);
                $ext = pathinfo($model->image , PATHINFO_EXTENSION);

                $newFname = $filename.'.'.$ext;
                $path=Yii::getAlias('@membersImgPath');

                    if(!empty($newFname)){
                        $model->image->saveAs($path.$newFname);
                        $model->image = $newFname;
                        if($model->save()){
                        return $this->redirect(['view', 'id' => $model->id]);
                        }
                    }

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

这是视图

echo FileInput::widget([
    'name' => 'photo', 
    'options' => ['accept' => 'image/*'],
]);

2 个答案:

答案 0 :(得分:1)

来自你的评论,

  

$ form = ActiveForm :: begin([' type' => ActiveForm :: TYPE_VERTICAL],[' opti ons' => [' enctype&# 39; =>'米ultipart /格式数据']]);

ActiveForm::begin没有第二个参数。您需要使用单个选项数组。

$form = ActiveForm::begin([
    'type'    => ActiveForm::TYPE_VERTICAL,
    'opti‌​ons' => [
        'enctype' => 'm‌​ultipart/form-data'
    ]‌
​]);

答案 1 :(得分:0)

首先,你必须检查是否有文件。为此,请尝试:

if(UploadedFile::getInstance($model, 'image')) {
     // here should go your code with $model->image
}

您使用pathinfo获取文件名和扩展名。请记住,您使用的是强大的框架,您只需初始化类UploadedFile,它可以为您完成所有事情:

if(UploadedFile::getInstance($model, 'image')) {
     $model->image = UploadedFile::getInstance($model, 'image');
     $newFname = $model->image->name;     // UploadedFile have properties like `name`, `tempName`, even `size`!
}

对代码执行此小修复后(您应该始终检查是否设置了某些内容) - 我们可以解决主要问题。

您的输入字段名称为photo,但您尝试获取名为image的图片。

改变这个:

UploadedFile::getInstance($model, 'image');

对此:

UploadedFile::getInstance($model, 'photo');   // remeber to change it in `if` statement aswell!!

Theres还可以尝试上传大于post_max_sizeupload_max_filesize允许的文件。在php.ini中更改此属性,重新启动服务器,然后重试。如果仍然不对,请尝试调试此事,首先在控制器中执行var_dump($_FILES);die;