我新建的表中的头像的字段名是img,用的是gii生成的后台表的model,curd,默认的img是字符串,下面看如何将这个字符串更改为上传图像。

在试图文件中:(备注下面图片的应该是'htmlOptions'=>array('enctype'=>'multipart/form-data'),图片上是错的)

yii 图片上传以及图片处理扩展_yii 自带的类 图片上

在模型文件中:

yii 图片上传以及图片处理扩展_yii 自带的类 图片上_02

在控制器文件中:

yii 图片上传以及图片处理扩展_yii 自带的类 图片上_03

在网站根目录下创建p_w_picpaths/upfile 文件夹,就可以实现上传的功能了。

 /*
 *  $file 是实例化一个CUploadedFile,
 *   然后调用一个saveas()方法,这个方法的参数是要传递过来具体的路径和名称
 *    将具体的路径和名称写入数据库
 */
 //   控制器中
 public function actionUpfile(){
        /*
         * 图片上传
         */
        $model = new Img();
        if(isset($_POST['Img'])){
        //获取一个CUploadfile的实例
        $file = CUploadedFile::getInstance($model,'url');
        //判断实例化是否成功 将图片重命名
        if(is_object($file)&&get_class($file) === 'CUploadedFile'){
            $model->url = './p_w_picpaths/upfile/file'.time().'_'.rand(0,9999).'.'.$file->extensionName;
        }else{
            $model->url='./p_w_picpaths/upfile/no.jpg';
        }
        //将表中的其他的选项保存到数据表中  并将文件开始上传
        if($model->save()){
            if(is_object($file) && get_class($file) === 'CUploadedFile'){
            //调用save方法,将命名和路径以参数形式传递
                $file->saveAs($model->url);
                echo "上传成功";
            }   // 上传图片
            else{
                echo "上传失败";
            }

        }}
        $this->render('upfile',array('model'=>$model));
    }
    
  //视图中
  <div class="form">
    <?php $form=$this->beginWidget('CActiveForm', array(
        'id'=>'img-form',
        'enableAjaxValidation'=>false,
        'htmlOptions'=>array('enctype'=>'multipart/form-data'),
    )); ?>
    <p>字段带<span class="required">*</span> 的为必填项.</p
    <div class="row">
		<?php echo $form->labelEx($model,'url'); ?>
        <?php echo CHtml::activeFileField($model,'url');?>
		<?php echo $form->error($model,'url'); ?>
	</div>
    <div class="row buttons">
        <?php echo CHtml::submitButton($model->isNewRecord ? '新增' : '更新'); ?>
    </div>
    <?php $this->endWidget(); ?>
</div>  

//在模型中 rule

return array(
		    //array('url', 'length', 'max'=>100),
            array('url',
                'file',    //定义为file类型
              //  'allowEmpty'=>true,
                'types'=>'jpg,png,gif,doc,docx,pdf,xls,xlsx,zip,rar,ppt,pptx',   //上传文件的类型
                'maxSize'=>1024*1024*10,    //上传大小限制,注意不是php.ini中的上传文件大小
                'tooLarge'=>'文件大于10M,上传失败!请上传小于10M的文件!'
            ),
			// The following rule is used by search().
			// @todo Please remove those attributes that should not be searched.
			array('id, url', 'safe', 'on'=>'search'),
		);

完成了图片的上传以后,如何来进行图片的处理呢,yii有提供图片处理的扩展。

下载地址:http://www.yiiframework.com/extension/p_w_picpath#hh1

下载解压后,将p_w_picpath文件夹放在exetension目录下,将helper文件夹放在protect下。

在配置文件中:

'import'=>array(
		'application.models.*',
		'application.components.*',
                'application.helpers.*', //引入helper文件夹
	),
 'p_w_picpath'=>array(
            'class'=>'application.extensions.p_w_picpath.CImageComponent',
                // GD or ImageMagick
            'driver'=>'GD',
                // ImageMagick setup path
            'params'=>array('directory'=>'/opt/local/bin'),
            ),

        'authManager'=>array(
            'class'=>'CDbAuthManager',//认证类名称
            'defaultRoles'=>array('guest'),//默认角色
            'itemTable' => 'authitem',//认证项表名称
            'itemChildTable' => 'authitemchild',//认证项父子关系
            'assignmentTable' => 'authassignment',//认证项赋权关系
        ),

在控制器的方法中:

$p_w_picpath = Yii::app()->p_w_picpath->load('p_w_picpaths/upfile/1sfdf.jpg');
        $p_w_picpath->resize(400, 100)->rotate(-45)->quality(75)->sharpen(20);
        $p_w_picpath->save('p_w_picpaths/upfile/aaa.jpg'); // or $p_w_picpath->save('p_w_picpaths/small.jpg');

图片上传成功以后,将图片的路径传递过来,然后操作,可以保存覆盖原来的文件也可以另外保存文件。