如何在yii上传照片?

时间:2013-11-26 11:06:51

标签: php image yii

我无法在我的数据库和文件夹中上传照片...如果我使用CModel类来构建表单,这个相同的代码正常工作...但是如果我使用普通的HTML它会给我错误Profilepic cannot be blank ......我的代码在下面给出

我的表单

    <form method="post" action="<?php echo Yii::app()->getBaseUrl(true).'/index.php?r=user/create'?>" enctype="multipart/form-data">
<div class="row">
    <label>Username</label><input type="text" name="username"/><span><?php if(isset($error['username'])) echo $error['username'][0]; ?></span>
</div> 
<div class="row">
    <label>Password</label><input type="password" name="password"/><span><?php if(isset($error['password'])) echo $error['password'][0]; ?></span>
</div>
<div class="row">
    <label>Email</label><input type="text" name="email"/><span><?php if(isset($error['email'])) echo $error['email'][0]; ?></span>
</div>
<div class="row">
    <label>Profile pic</label><input type="file" name="profilepic"/><span><?php if(isset($error['profilepic'])) echo $error['profilepic'][0]; ?></span>
</div>
    <input type="hidden" value="No" name="flag"/>
<?php echo CHtml::submitButton($model->isNewRecord ? 'Create' : 'Save'); ?>

我的控制器方法

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

    // Uncomment the following line if AJAX validation is needed
    // $this->performAjaxValidation($model);
    if(isset($_POST))
    {
                    $uploadedFile=CUploadedFile::getInstance($model,'profilepic');
                    $fileName = "{$uploadedFile}";  
                    $model->profilepic = $fileName;
        $model->attributes=$_POST;

                    if($model->save())
                    {
                        $a=$uploadedFile->saveAs(Yii::app()->basePath.'/../images/'.$fileName);
                        $this->redirect(array('create'));
                    }
    }

    $this->render('create',array(
        'model'=>$model,
    ));
}

我的规则方法数组

     return array(
        array('username, password,email,profilepic', 'required'),
        array('email','email'),
                    array('profilepic','file','types'=>'jpg,jpeg,png'),
                    array('email','unique'),
        array('username,password,email,flag,profilepic', 'safe', 'on'=>'search'),
    );

有人能帮帮我......

提前致谢

2 个答案:

答案 0 :(得分:2)

您需要更改控制器代码,例如关注...

public function actionCreate()
{
   $model=new User;
   if(Yii::app()->request->isPostRequest) //change it
   {
                $model->profilepic=CUploadedFile::getInstanceByName('profilepic');
               // $fileName = "{$uploadedFile}"; //this is not required  
               // $model->profilepic = $fileName; //this is also not required
                $model->attributes=$_POST;

                if($model->save())
                {
                    $model->profilepic->saveAs(Yii::app()->basePath.'/../images/'.$model->profilepic);
                    $this->redirect(array('create'));
                }
   }

   $this->render('create',array(
       'model'=>$model,
   )); 
}

首先是你需要的所有变化......我改变的一件最重要的事情是 getInstanceByName('profilepic')

希望它可以解决你的问题..

答案 1 :(得分:0)

让我们逐行看一下(某些特定的行):

1)$ uploadedFile = CUploadedFile :: getInstance($ model,'profilepic'); 您正在使用CUploadedFile Yii类中的“getInstance”方法。请记住,Yii的内容很好,http://www.yiiframework.com/doc/api/1.1/CUploadedFile适用于CUploadedFile类。

2)$ fileName =“{$ uploadedFile}”; 这是你试图从上面获取“getInstance”检索的临时文件名。这是第一个问题:http://www.yiiframework.com/doc/api/1.1/CUploadedFile#getInstance-detail public static CUploadedFile getInstance(CModel $ model,string $ attribute) - 这就是“getInstance”所期望的。如您所见,第一个参数是$ model,即从CModel继承的模型实例,由于未知原因,您试图避免使用CModel。 因此,当您调用“getInstance”时,此方法根本不知道您正在调用的内容(尤其是在您的问题中未显示“User”类时)。这就是第三行吐出“Profilepic不能为空”的原因,“getInstance”方法没有返回任何内容,“Profilepic”也无法使用。

3)$ model-&gt; profilepic = $ fileName; 我想现在你很清楚为什么会出现错误。

所以,你可以加载一个模型(回到CModel),或者至少应该深入了解你对“User”类的看法(取自$ model = new User;)并更加关注Yii文档。

希望这会给你至少一些方向而且没有冒犯意味着,我只是Yii文档粉丝之一。