本文實例講述了Yii框架實現圖片上傳的方法。分享給大家供大家參考,具體如下:
今天在網上看了下有關圖片上傳的教程,歷經挫折才調試好,現在把相關代碼及其說明貼出來,以供初次使用的朋友們參考。
Model:
<?phpclass Upload extends CActiveRecord {  public $image;  public static function model($className = __CLASS__) {    return $className;  }  public function tableName() {    return '{{resource}}';  }  public function rules() {    return array(      array('image', 'file', 'types'=>'jpg, gif, png')    );  }}注:resource為數據表,表前綴可在main.php內設置,相信朋友們在看到文件上傳時應該熟悉了main.php位置在哪及運作機制。
Controller:
<?phpclass UploadController extends Controller {  public function actionIndex() {    $model=new Upload;    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:
<meta charset="utf-8"><?php echo CHtml::form(SITE_URL . 'admin/upload/index','post',array('enctype'=>'multipart/form-data')); ?><?php echo CHtml::activeFileField($model, 'image'); ?><?php echo CHtml::submitButton('提交');?><?php echo CHtml::endForm(); ?>注:上面的SITE_URL為項目定義的常量,也就是項目的網址
相信經過上述步驟,朋友們應該可以上傳成功圖片,而且在項目下的assets目錄下找到上傳的圖片。因為發現yii沒有縮略圖的方法,于是把thinkphp縮略圖的方法整合了進來,把下面代碼保存為Image.php放在項目下的protected/extensions目錄下
<?phpclass Image extends CController {  /**   +----------------------------------------------------------   * 取得圖像信息   *   +----------------------------------------------------------   * @static   * @access public   +----------------------------------------------------------   * @param string $image 圖像文件名   +----------------------------------------------------------   * @return mixed   +----------------------------------------------------------   */  static function getImageInfo($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 {      return false;    }  }  /**   +----------------------------------------------------------   * 生成縮略圖   +----------------------------------------------------------   * @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   +----------------------------------------------------------   */  static function thumb($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)) {        return false;      }      $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;    }    return false;  }}?>再在項目下的protected/config/main.php中import字段加上
// autoloading model and component classes 'import'=>array( 'application.models.*', 'application.components.*', 'application.extensions.*', #加上此行,意思為自動載入 ),
再上面的Controller加上
public function actionIndex() {    $model=new Upload;    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程序設計有所幫助。
新聞熱點
疑難解答
圖片精選