Yii框架实现图片上传的方法详解
本文实例讲述了Yii框架实现图片上传的方法。分享给大家供大家参考,具体如下:
今天在网上看了下有关图片上传的教程,历经挫折才调试好,现在把相关代码及其说明贴出来,以供初次使用的朋友们参考。
Model:
'jpg,gif,png') ); } }
注:resource为数据表,表前缀可在main.php内设置,相信朋友们在看到文件上传时应该熟悉了main.php位置在哪及运作机制。
Controller:
image=CUploadedFile::getInstance($model,'image'); $ext=$model->image->getExtensionName(); $fileName=uniqid().'.'.$ext; $model->image->saveAs('assets/'.$fileName); } $this->renderPartial('index',array('model'=>$model)); } }
注:saveAs里面是存放图片上传后的地址,追踪下代码可以发现,该参数是move_uploaded_file函数的第二个参数,一定得是文件名。
View:
'multipart/form-data'));?>
注:上面的SITE_URL为项目定义的常量,也就是项目的网址
相信经过上述步骤,朋友们应该可以上传成功图片,而且在项目下的assets目录下找到上传的图片。因为发现yii没有缩略图的方法,于是把thinkphp缩略图的方法整合了进来,把下面代码保存为Image.php放在项目下的protected/extensions目录下
$imageInfo[0], "height"=>$imageInfo[1], "type"=>$imageType, "size"=>$imageSize, "mime"=>$imageInfo['mime'] ); return$info; }else{ returnfalse; } } /** +---------------------------------------------------------- *生成缩略图 +---------------------------------------------------------- *@static *@accesspublic +---------------------------------------------------------- *@paramstring$image原图 *@paramstring$type图像格式 *@paramstring$thumbname缩略图文件名 *@paramstring$maxWidth宽度 *@paramstring$maxHeight高度 *@paramstring$position缩略图保存目录 *@paramboolean$interlace启用隔行扫描 +---------------------------------------------------------- *@returnvoid +---------------------------------------------------------- */ staticfunctionthumb($image,$thumbname,$type='',$maxWidth=200,$maxHeight=50,$interlace=true){ //获取原图信息 $info=Image::getImageInfo($image); if($info!==false){ $srcWidth=$info['width']; $srcHeight=$info['height']; $type=empty($type)?$info['type']:$type; $type=strtolower($type); $interlace=$interlace?1:0; unset($info); $scale=min($maxWidth/$srcWidth,$maxHeight/$srcHeight);//计算缩放比例 if($scale>=1){ //超过原图大小不再缩略 $width=$srcWidth; $height=$srcHeight; }else{ //缩略图尺寸 $width=(int)($srcWidth*$scale); $height=(int)($srcHeight*$scale); } //载入原图 $createFun='ImageCreateFrom'.($type=='jpg'?'jpeg':$type); if(!function_exists($createFun)){ returnfalse; } $srcImg=$createFun($image); //创建缩略图 if($type!='gif'&&function_exists('imagecreatetruecolor')) $thumbImg=imagecreatetruecolor($width,$height); else $thumbImg=imagecreate($width,$height); //png和gif的透明处理byluofei614 if('png'==$type){ imagealphablending($thumbImg,false);//取消默认的混色模式(为解决阴影为绿色的问题) imagesavealpha($thumbImg,true);//设定保存完整的alpha通道信息(为解决阴影为绿色的问题) }elseif('gif'==$type){ $trnprt_indx=imagecolortransparent($srcImg); if($trnprt_indx>=0){ //itstransparent $trnprt_color=imagecolorsforindex($srcImg,$trnprt_indx); $trnprt_indx=imagecolorallocate($thumbImg,$trnprt_color['red'],$trnprt_color['green'],$trnprt_color['blue']); imagefill($thumbImg,0,0,$trnprt_indx); imagecolortransparent($thumbImg,$trnprt_indx); } } //复制图片 if(function_exists("ImageCopyResampled")) imagecopyresampled($thumbImg,$srcImg,0,0,0,0,$width,$height,$srcWidth,$srcHeight); else imagecopyresized($thumbImg,$srcImg,0,0,0,0,$width,$height,$srcWidth,$srcHeight); //对jpeg图形设置隔行扫描 if('jpg'==$type||'jpeg'==$type) imageinterlace($thumbImg,$interlace); //生成图片 $imageFun='image'.($type=='jpg'?'jpeg':$type); $imageFun($thumbImg,$thumbname); imagedestroy($thumbImg); imagedestroy($srcImg); return$thumbname; } returnfalse; } } ?>
再在项目下的protected/config/main.php中import字段加上
//autoloadingmodelandcomponentclasses 'import'=>array( 'application.models.*', 'application.components.*', 'application.extensions.*',#加上此行,意思为自动载入 ),
再上面的Controller加上
publicfunctionactionIndex(){ $model=newUpload; if(isset($_POST['Upload'])){ $model->image=CUploadedFile::getInstance($model,'image'); $ext=$model->image->getExtensionName(); $fileName=uniqid().'.'.$ext; $model->image->saveAs('assets/'.$fileName); //生成缩略图 Image::thumb('assets/'.$fileName,'assets/'.uniqid().'.'.$ext); } $this->renderPartial('index',array('model'=>$model)); }
这次就完整了。
更多关于Yii相关内容感兴趣的读者可查看本站专题:《Yii框架入门及常用技巧总结》、《php优秀开发框架总结》、《smarty模板入门基础教程》、《php面向对象程序设计入门教程》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》
希望本文所述对大家基于Yii框架的PHP程序设计有所帮助。