Yii的上传类使用CUploadedFile

视图:

<div class="row">
		<?php echo $form->labelEx($model,'imagefile'); ?>
		<?php echo $form->fileField($model,'imagefile',array('size'=>50)); 
			  if(!empty($model->imgurl))
			  	echo "<img src='".BASEURL."/resources/icons/picture.png' title='缩略图'/>";
		?>
	</div>

create控制器:

$model->attributes=$_POST['Article'];
$upload=CUploadedFile::getInstance($model,'imagefile');  //得到原照片这个对象
if(!empty($upload))
{
$model->imgurl=Upload::createFile($upload,'article','create');  imgurl数据库字段表示图片存储路径
}

上传类:放在extension里面

<?php
/**
 * $upload: CUploadedFile::getInstance;
 * $type:  artilce product
 * $act:  create update
 * $imgurl:  delete old imgurl when update
 */
class Upload{

	public static function createFile($upload,$type,$act,$imgurl=''){
		if(!empty($imgurl)&&$act==='update'){
			$deleteFile=Yii::app()->basePath.'/../'.$imgurl;
			if(is_file($deleteFile))
				unlink($deleteFile);      //修改图片的时候删除原片
		}
		$uploadDir=Yii::app()->basePath.'/../uploads/'.$type.'/'.date('Y-m',time());   //指定路径名格式
		self::recursionMkDir($uploadDir);            //创建目录
		$imgname=time().'-'.rand().'.'.$upload->extensionName;  
		
		
		
		//图片存储路径
		$imageurl='/uploads/'.$type.'/'.date('Y-m',time()).'/'.$imgname;
		
		
		//存储绝对路径
		$uploadPath=$uploadDir.'/'.$imgname;
		
		if($upload->saveAs($uploadPath)){
			return $imageurl;
		}else{
			return null;
		}
	}
	private static function recursionMkDir($dir){
		if(!is_dir($dir)){                                  //is_dir() 函数检查指定的文件是否是目录。
			if(!is_dir(dirname($dir))){
				self::recursionMkDir(dirname($dir));            //dirname() 函数返回路径中的目录部分。
				mkdir($dir,'0777');                            //mkdir()
			}else{
				mkdir($dir,'0777');                            //mkdir() 函数创建目录。若成功,则返回 true,否则返回 false。
			}
		}
	}
}

扩展:

与前面(http://zccst.iteye.com/blog/1114948)的区别是不再依赖model。 
也不再依赖yii自带的前端表单控件activeFileField。 
感觉这样轻量级多了。 

简言之: 
1,form要带enctype="multipart/form-data" 
2,文件控件只需写name即可。<input type="file" name="fileName" /> 
3,直接在php端使用$attach = CUploadedFile::getInstanceByName("fileName");即可。 
不需要先用$fileName = $this->request->getParam('fileName'); 
注可以在前端写多个相同name的文件控件,这样在后端用$attaches = CUploadedFile::getInstancesByName("fileName");即可 

一、前端代码 
Html代码  收藏代码
<form id="upForm" action="<?php echo $this->createUrl('repairUpload'); ?>" method="post" enctype    ="multipart/form-data">  
    <input type="file" name="repair_attached_file" id="repair_attached_file" /><input type="submit" name="submitBtn" value="立即上传" />  
</form>  
<span id="upload_repairinfo_success" style="color:blue;"></span>  



二、后端代码 
Php代码  收藏代码
public function actionRepairUpload(){  
    $attach = CUploadedFile::getInstanceByName('repair_attached_file');  
    $retValue = "";  
    if($attach->size > 3*1024*1024){  
        $retValue = "提示:文件大小不能超过3M";  
    }else{  
        $f = file_get_contents($attach->tempName);  
        $a = new Attachment();  
        $a->ref_type = "failParts";  
        $a->data = $f;  
        $a->file_path = $attach->name;  
        $a->save();  
        $retValue = $a->id;  
    }  
    echo $retValue;  
}  

  

Yii生成缩略图生成函数cthumb
admin | 2012-07-01

需求

Yii 1.0以上版本

要求GD库

下载本站附件

安装

解压文件至protected/extensions

extension=php_gd2.dll

使用

看下面的例子:
...             
$im = null;
$imagetype = strtolower($model->image->extensionName)
if($imagetype == 'gif')
    $im = imagecreatefromgif($path);
else if ($imagetype == 'jpg')
    $im = imagecreatefromjpeg($path);
else if ($imagetype == 'png')
    $im = imagecreatefrompng($path);
CThumb::resizeImage ( 
$im,100, 100,
'd:uploadhead\thumb\test' . $model->image->extensionName, $model->image->extensionName );

  

原文地址:https://www.cnblogs.com/fengzhiqiangcaisangzi/p/3381685.html