当前位置:首页 > PHP教程 > php高级应用 > 列表

利用Yii框架实现图片上传

发布:smiling 来源: PHP粉丝网  添加日期:2018-08-06 17:25:16 浏览: 评论:0 

本文实例讲述了Yii框架实现图片上传的方法。分享给大家供大家参考,具体如下:

今天在网上看了下有关图片上传的教程,历经挫折才调试好,现在把相关代码及其说明贴出来,以供初次使用的朋友们参考。

Model:

  1. classUploadextendsCActiveRecord { 
  2.  
  3.   public$image
  4.  
  5.   publicstaticfunctionmodel($className=__CLASS__) { 
  6.  
  7.     return$className
  8.  
  9.   } 
  10.  
  11.   publicfunctiontableName() { 
  12.  
  13.     return'{{resource}}' 
  14.  
  15.   } 
  16.  
  17.   publicfunctionrules() { 
  18.  
  19.     returnarray( 
  20.  
  21.       array('image','file','types'=>'jpg, gif, png'
  22.  
  23.     ); 
  24.  
  25.   } 
  26.  

注:resource为数据表,表前缀可在main.php内设置,相信朋友们在看到文件上传时应该熟悉了main.php位置在哪及运作机制。

Controller:

  1. classUploadControllerextendsController { 
  2.  
  3.   publicfunctionactionIndex() { 
  4.  
  5.     $model=newUpload; 
  6.  
  7.     if(isset($_POST['Upload'])) { 
  8.  
  9.       $model->image=CUploadedFile::getInstance($model,'image'); 
  10.  
  11.       $ext=$model->image->getExtensionName(); 
  12.  
  13.       $fileName= uniqid() .'.'.$ext
  14.  
  15.       $model->image->saveAs('assets/'.$fileName); 
  16.  
  17.     } 
  18.  
  19.     $this->renderPartial('index',array('model'=>$model)); 
  20.  
  21.   } 
  22.  

注:saveAs里面是存放图片上传后的地址,追踪下代码可以发现,该参数是move_uploaded_file函数的第二个参数,一定得是文件名。

View:

'multipart/form-data'));

注:上面的SITE_URL为项目定义的常量,也就是项目的网址

相信经过上述步骤,朋友们应该可以上传成功图片,而且在项目下的assets目录下找到上传的图片。因为发现yii没有缩略图的方法,于是把thinkphp缩略图的方法整合了进来,把下面代码保存为Image.php放在项目下的protected/extensions目录下.

  1. classImageextendsCController { 
  2.  
  3.   /** 
  4.  
  5.    +---------------------------------------------------------- 
  6.  
  7.    * 取得图像信息 
  8.  
  9.    * 
  10.  
  11.    +---------------------------------------------------------- 
  12.  
  13.    * @static 
  14.  
  15.    * @access public 
  16.  
  17.    +---------------------------------------------------------- 
  18.  
  19.    * @param string $image 图像文件名 
  20.  
  21.    +---------------------------------------------------------- 
  22.  
  23.    * @return mixed 
  24.  
  25.    +---------------------------------------------------------- 
  26.  
  27.    */ 
  28.  
  29.   staticfunctiongetImageInfo($img) { 
  30.  
  31.     $imageInfo=getimagesize($img); 
  32.  
  33.     if($imageInfo!== false) { 
  34.  
  35.       $imageType=strtolower(substr(image_type_to_extension($imageInfo[2]), 1)); 
  36.  
  37.       $imageSize=filesize($img); 
  38.  
  39.       $info=array
  40.  
  41.         "width"=>$imageInfo[0], 
  42.  
  43.         "height"=>$imageInfo[1], 
  44.  
  45.         "type"=>$imageType
  46.  
  47.         "size"=>$imageSize
  48.  
  49.         "mime"=>$imageInfo['mime'
  50.  
  51.       ); 
  52.  
  53.       return$info
  54.  
  55.     }else
  56.  
  57.       returnfalse; 
  58.  
  59.     } 
  60.  
  61.   } 
  62.  
  63.   /** 
  64.  
  65.    +---------------------------------------------------------- 
  66.  
  67.    * 生成缩略图 
  68.  
  69.    +---------------------------------------------------------- 
  70.  
  71.    * @static 
  72.  
  73.    * @access public 
  74.  
  75.    +---------------------------------------------------------- 
  76.  
  77.    * @param string $image 原图 
  78.  
  79.    * @param string $type 图像格式 
  80.  
  81.    * @param string $thumbname 缩略图文件名 
  82.  
  83.    * @param string $maxWidth 宽度 
  84.  
  85.    * @param string $maxHeight 高度 
  86.  
  87.    * @param string $position 缩略图保存目录 
  88.  
  89.    * @param boolean $interlace 启用隔行扫描 
  90.  
  91.    +---------------------------------------------------------- 
  92.  
  93.    * @return void 
  94.  
  95.    +---------------------------------------------------------- 
  96.  
  97.    */ 
  98.  
  99.   staticfunctionthumb($image,$thumbname,$type='',$maxWidth=200,$maxHeight=50,$interlace=true) { 
  100.  
  101.     // 获取原图信息 
  102.  
  103.     $info= Image::getImageInfo($image); 
  104.  
  105.     if($info!== false) { 
  106.  
  107.       $srcWidth=$info['width']; 
  108.  
  109.       $srcHeight=$info['height']; 
  110.  
  111.       $type=emptyempty($type) ?$info['type'] :$type
  112.  
  113.       $type=strtolower($type); 
  114.  
  115.       $interlace=$interlace? 1 : 0; 
  116.  
  117.       unset($info); 
  118.  
  119.       $scale= min($maxWidth/$srcWidth,$maxHeight/$srcHeight);// 计算缩放比例 
  120.  
  121.       if($scale>= 1) { 
  122.  
  123.         // 超过原图大小不再缩略 
  124.  
  125.         $width=$srcWidth
  126.  
  127.         $height=$srcHeight
  128.  
  129.       }else
  130.  
  131.         // 缩略图尺寸 
  132.  
  133.         $width= (int) ($srcWidth*$scale); 
  134.  
  135.         $height= (int) ($srcHeight*$scale); 
  136.  
  137.       } 
  138.  
  139.       // 载入原图 
  140.  
  141.       $createFun='ImageCreateFrom'. ($type=='jpg'?'jpeg':$type); 
  142.  
  143.       if(!function_exists($createFun)) { 
  144.  
  145.         returnfalse; 
  146.  
  147.       } 
  148.  
  149.       $srcImg=$createFun($image); 
  150.  
  151.       //创建缩略图 
  152.  
  153.       if($type!='gif'&& function_exists('imagecreatetruecolor')) 
  154.  
  155.         $thumbImg= imagecreatetruecolor($width,$height); 
  156.  
  157.       else 
  158.  
  159.         $thumbImg= imagecreate($width,$height); 
  160.  
  161.        //png和gif的透明处理 by luofei614 
  162.  
  163.       if('png'==$type){ 
  164.  
  165.         imagealphablending($thumbImg, false);//取消默认的混色模式(为解决阴影为绿色的问题) 
  166.  
  167.         imagesavealpha($thumbImg,true);//设定保存完整的 alpha 通道信息(为解决阴影为绿色的问题) 
  168.  
  169.       }elseif('gif'==$type){ 
  170.  
  171.         $trnprt_indx= imagecolortransparent($srcImg); 
  172.  
  173.          if($trnprt_indx>= 0) { 
  174.  
  175.             //its transparent 
  176.  
  177.             $trnprt_color= imagecolorsforindex($srcImg,$trnprt_indx); 
  178.  
  179.             $trnprt_indx= imagecolorallocate($thumbImg,$trnprt_color['red'],$trnprt_color['green'],$trnprt_color['blue']); 
  180.  
  181.             imagefill($thumbImg, 0, 0,$trnprt_indx); 
  182.  
  183.             imagecolortransparent($thumbImg,$trnprt_indx); 
  184.  
  185.        } 
  186.  
  187.       } 
  188.  
  189.       // 复制图片 
  190.  
  191.       if(function_exists("ImageCopyResampled")) 
  192.  
  193.         imagecopyresampled($thumbImg,$srcImg, 0, 0, 0, 0,$width,$height,$srcWidth,$srcHeight); 
  194.  
  195.       else 
  196.  
  197.         imagecopyresized($thumbImg,$srcImg, 0, 0, 0, 0,$width,$height,$srcWidth,$srcHeight); 
  198.  
  199.       // 对jpeg图形设置隔行扫描 
  200.  
  201.       if('jpg'==$type||'jpeg'==$type
  202.  
  203.         imageinterlace($thumbImg,$interlace); 
  204.  
  205.       // 生成图片 
  206.  
  207.       $imageFun='image'. ($type=='jpg'?'jpeg':$type); 
  208.  
  209.       $imageFun($thumbImg,$thumbname); 
  210.  
  211.       imagedestroy($thumbImg); 
  212.  
  213.       imagedestroy($srcImg); 
  214.  
  215.       return$thumbname
  216.  
  217.     } 
  218.  
  219.     returnfalse; 
  220.  
  221.   } 
  222.  

再在项目下的protected/config/main.php中import字段加上

  1. // autoloading model and component classes 
  2.  
  3.   'import'=>array
  4.  
  5.     'application.models.*'
  6.  
  7.     'application.components.*'
  8.  
  9.     'application.extensions.*',  #加上此行,意思为自动载入 
  10.  
  11.   ), 

再上面的Controller加上

  1. publicfunctionactionIndex() { 
  2.  
  3.     $model=newUpload; 
  4.  
  5.     if(isset($_POST['Upload'])) { 
  6.  
  7.       $model->image=CUploadedFile::getInstance($model,'image'); 
  8.  
  9.       $ext=$model->image->getExtensionName(); 
  10.  
  11.       $fileName= uniqid() .'.'.$ext
  12.  
  13.       $model->image->saveAs('assets/'.$fileName); 
  14.  
  15.       // 生成缩略图 
  16.  
  17.       Image::thumb('assets/'.$fileName,'assets/'. uniqid() .'.'.$ext); 
  18.  
  19.     } 
  20.  
  21.     $this->renderPartial('index',array('model'=>$model)); 
  22.  

这次就完整了。

希望本文所述对大家基于Yii框架的PHP程序设计有所帮助。

Tags: Yii框架 Yii图片上传

分享到: