本文實(shí)例講述了Yii框架實(shí)現(xiàn)圖片上傳的方法。分享給大家供大家參考,具體如下:
今天在網(wǎng)上看了下有關(guān)圖片上傳的教程,歷經(jīng)挫折才調(diào)試好,現(xiàn)在把相關(guān)代碼及其說(shuō)明貼出來(lái),以供初次使用的朋友們參考。
Model:
- classUploadextendsCActiveRecord {
- public$image;
- publicstaticfunctionmodel($className=__CLASS__) {
- return$className;
- }
- publicfunctiontableName() {
- return'{{resource}}'
- }
- publicfunctionrules() {
- returnarray(
- array('image','file','types'=>'jpg, gif, png')
- );
- }
- }
注:resource為數(shù)據(jù)表,表前綴可在main.php內(nèi)設(shè)置,相信朋友們?cè)诳吹轿募蟼鲿r(shí)應(yīng)該熟悉了main.php位置在哪及運(yùn)作機(jī)制。
Controller:
- classUploadControllerextendsController {
- 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);
- }
- $this->renderPartial('index',array('model'=>$model));
- }
- }
注:saveAs里面是存放圖片上傳后的地址,追蹤下代碼可以發(fā)現(xiàn),該參數(shù)是move_uploaded_file函數(shù)的第二個(gè)參數(shù),一定得是文件名。
View:
'multipart/form-data'));
注:上面的SITE_URL為項(xiàng)目定義的常量,也就是項(xiàng)目的網(wǎng)址
相信經(jīng)過(guò)上述步驟,朋友們應(yīng)該可以上傳成功圖片,而且在項(xiàng)目下的assets目錄下找到上傳的圖片。因?yàn)榘l(fā)現(xiàn)yii沒(méi)有縮略圖的方法,于是把thinkphp縮略圖的方法整合了進(jìn)來(lái),把下面代碼保存為Image.php放在項(xiàng)目下的protected/extensions目錄下.
- classImageextendsCController {
- /**
- +----------------------------------------------------------
- * 取得圖像信息
- *
- +----------------------------------------------------------
- * @static
- * @access public
- +----------------------------------------------------------
- * @param string $image 圖像文件名
- +----------------------------------------------------------
- * @return mixed
- +----------------------------------------------------------
- */
- staticfunctiongetImageInfo($img) {
- $imageInfo=getimagesize($img);
- if($imageInfo!== false) {
- $imageType=strtolower(substr(image_type_to_extension($imageInfo[2]), 1));
- $imageSize=filesize($img);
- $info=array(
- "width"=>$imageInfo[0],
- "height"=>$imageInfo[1],
- "type"=>$imageType,
- "size"=>$imageSize,
- "mime"=>$imageInfo['mime']
- );
- return$info;
- }else{
- returnfalse;
- }
- }
- /**
- +----------------------------------------------------------
- * 生成縮略圖
- +----------------------------------------------------------
- * @static
- * @access public
- +----------------------------------------------------------
- * @param string $image 原圖
- * @param string $type 圖像格式
- * @param string $thumbname 縮略圖文件名
- * @param string $maxWidth 寬度
- * @param string $maxHeight 高度
- * @param string $position 縮略圖保存目錄
- * @param boolean $interlace 啟用隔行掃描
- +----------------------------------------------------------
- * @return void
- +----------------------------------------------------------
- */
- staticfunctionthumb($image,$thumbname,$type='',$maxWidth=200,$maxHeight=50,$interlace=true) {
- // 獲取原圖信息
- $info= Image::getImageInfo($image);
- if($info!== false) {
- $srcWidth=$info['width'];
- $srcHeight=$info['height'];
- $type=emptyempty($type) ?$info['type'] :$type;
- $type=strtolower($type);
- $interlace=$interlace? 1 : 0;
- unset($info);
- $scale= min($maxWidth/$srcWidth,$maxHeight/$srcHeight);// 計(jì)算縮放比例
- if($scale>= 1) {
- // 超過(guò)原圖大小不再縮略
- $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);
- //創(chuàng)建縮略圖
- if($type!='gif'&& function_exists('imagecreatetruecolor'))
- $thumbImg= imagecreatetruecolor($width,$height);
- else
- $thumbImg= imagecreate($width,$height);
- //png和gif的透明處理 by luofei614
- if('png'==$type){
- imagealphablending($thumbImg, false);//取消默認(rèn)的混色模式(為解決陰影為綠色的問(wèn)題)
- imagesavealpha($thumbImg,true);//設(shè)定保存完整的 alpha 通道信息(為解決陰影為綠色的問(wèn)題)
- }elseif('gif'==$type){
- $trnprt_indx= imagecolortransparent($srcImg);
- if($trnprt_indx>= 0) {
- //its transparent
- $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);
- }
- }
- // 復(fù)制圖片
- 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);
- // 對(duì)jpeg圖形設(shè)置隔行掃描
- if('jpg'==$type||'jpeg'==$type)
- imageinterlace($thumbImg,$interlace);
- // 生成圖片
- $imageFun='image'. ($type=='jpg'?'jpeg':$type);
- $imageFun($thumbImg,$thumbname);
- imagedestroy($thumbImg);
- imagedestroy($srcImg);
- return$thumbname;
- }
- returnfalse;
- }
- }
再在項(xiàng)目下的protected/config/main.php中import字段加上
- // autoloading model and component classes
- 'import'=>array(
- 'application.models.*',
- 'application.components.*',
- 'application.extensions.*', #加上此行,意思為自動(dòng)載入
- ),
再上面的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));
- }
這次就完整了。
希望本文所述對(duì)大家基于Yii框架的PHP程序設(shè)計(jì)有所幫助。
新聞熱點(diǎn)
疑難解答