萬盛學電腦網

 萬盛學電腦網 >> 網絡編程 >> php編程 >> 利用Yii框架實現圖片上傳

利用Yii框架實現圖片上傳

這篇文章主要介紹了Yii框架實現圖片上傳的方法,結合實例形式較為詳細的分析了Yii框架實現圖片上傳功能的具體步驟與相關操作技巧,需要的朋友可以參考下 本文實例講述了Yii框架實現圖片上傳的方法。分享給大家供大家參考,具體如下:

今天在網上看了下有關圖片上傳的教程,歷經挫折才調試好,現在把相關代碼及其說明貼出來,以供初次使用的朋友們參考。

Model:

<?php

classUploadextendsCActiveRecord {

  public$image;

  publicstaticfunctionmodel($className=__CLASS__) {

    return$className;

  }

  publicfunctiontableName() {

    return'{{resource}}'

  }

  publicfunctionrules() {

    returnarray(

      array('image','file','types'=>'jpg, gif, png')

    );

  }

}

注:resource為數據表,表前綴可在main.php內設置,相信朋友們在看到文件上傳時應該熟悉了main.php位置在哪及運作機制。

Controller:

<?php

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裡面是存放圖片上傳後的地址,追蹤下代碼可以發現,該參數是move_uploaded_file函數的第二個參數,一定得是文件名。

View:

'multipart/form-data')); ?>

注:上面的SITE_URL為項目定義的常量,也就是項目的網址

相信經過上述步驟,朋友們應該可以上傳成功圖片,而且在項目下的assets目錄下找到上傳的圖片。因為發現yii沒有縮略圖的方法,於是把thinkphp縮略圖的方法整合了進來,把下面代碼保存為Image.php放在項目下的protected/extensions目錄下

<?php

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=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的透明處理 by luofei614

      if('png'==$type){

        imagealphablending($thumbImg, false);//取消默認的混色模式(為解決陰影為綠色的問題)

        imagesavealpha($thumbImg,true);//設定保存完整的 alpha 通道信息(為解決陰影為綠色的問題)

      }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);

       }

      }

      // 復制圖片

      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字段加上

// autoloading model and component classes

  '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框架的PHP程序設計有所幫助。

copyright © 萬盛學電腦網 all rights reserved