国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > PHP > 正文

php版阿里云OSS圖片上傳類詳解

2024-05-04 23:53:07
字體:
來源:轉載
供稿:網友

本文實例講述了php版阿里云OSS圖片上傳類。分享給大家供大家參考,具體如下:

1.阿里云基本函數

/** * 把本地變量的內容到文件 * 簡單上傳,上傳指定變量的內存值作為object的內容 */public function putObject($imgPath,$object){  $content = file_get_contents($imgPath); // 把當前文件的內容獲取到傳入文件中  $options = array();  try {    $this->ossClient->putObject($this->bucket, $object, $content, $options);  } catch (OssException $e) {    return $e->getMessage();  }  return TRUE;}/** * 上傳指定的本地文件內容 */public function uploadFile($imgPath,$object) //$_FILES['img']['tmp_name']{  $filePath = $imgPath;  $options = array();  try {    $this->ossClient->uploadFile($this->bucket, $object, $filePath, $options);  } catch (OssException $e) {    return $e->getMessage();  }  return TRUE;}// 刪除對象public function deleteObject($object) {  try {    $this->ossClient->deleteObject($this->bucket, $object);  } catch (OssException $e) {    return $e->getMessage();  }  return TRUE;}// 判斷對象是否存在public function doesObjectExist($object) {  try {    $result = $this->ossClient->doesObjectExist($this->bucket, $object);  } catch (OssException $e) {    return $e->getMessage();  }  return $result;}// 批量刪除對象public function deleteObjects($objects) {  try {    $this->ossClient->deleteObjects($this->bucket, $objects);  } catch (OssException $e) {    return $e->getMessage();  }  return TRUE;}/** * 獲取object的內容 * * @param OssClient $ossClient OssClient實例 * @param string $bucket 存儲空間名稱 * @return null */public function getObject($object){  $options = array();  try {    $content = $this->ossClient->getObject($this->bucket, $object, $options);  } catch (OssException $e) {    return $e->getMessage();  }  // file_get_contents  return $content;}

2.基本配置與輔助函數

public $ossClient,$bucket;private $configinfo =  array(  'maxSize'      => -1,  // 上傳文件的最大值  'supportMulti'   => true,  // 是否支持多文件上傳  'allowExts'     => array(),  // 允許上傳的文件后綴 留空不作后綴檢查  'allowTypes'    => array(),  // 允許上傳的文件類型 留空不做檢查  'thumb'       => false,  // 使用對上傳圖片進行縮略圖處理  'imageClassPath'  => 'ORG.Util.Image',  // 圖庫類包路徑  'thumbMaxWidth'   => '',// 縮略圖最大寬度  'thumbMaxHeight'  => '',// 縮略圖最大高度  'thumbPrefix'    => 'thumb_',// 縮略圖前綴  'thumbSuffix'    => '',  'thumbPath'     => '',// 縮略圖保存路徑  'thumbFile'     => '',// 縮略圖文件名  'thumbExt'     => '',// 縮略圖擴展名  'thumbRemoveOrigin' => false,// 是否移除原圖  'zipImages'     => false,// 壓縮圖片文件上傳  'autoSub'      => false,// 啟用子目錄保存文件  'subType'      => 'hash',// 子目錄創建方式 可以使用hash date custom  'subDir'      => '', // 子目錄名稱 subType為custom方式后有效  'dateFormat'    => 'Ymd',  'hashLevel'     => 1, // hash的目錄層次  'savePath'     => '',// 上傳文件保存路徑  'autoCheck'     => true, // 是否自動檢查附件  'uploadReplace'   => false,// 存在同名是否覆蓋  'saveRule'     => 'uniqid',// 上傳文件命名規則  'hashType'     => 'md5_file',// 上傳文件Hash規則函數名  );// 錯誤信息private $error = '';// 上傳成功的文件信息private $uploadFileInfo ;public function __get($name){  if(isset($this->configinfo[$name])) {    return $this->configinfo[$name];  }  return null;}public function __set($name,$value){  if(isset($this->configinfo[$name])) {    $this->configinfo[$name]  =  $value;  }}public function __isset($name){  return isset($this->configinfo[$name]);}/** * 架構函數 * @access public * @param array $config 上傳參數 */public function __construct($config=array()) {  if(is_array($config)) {    $this->config  =  array_merge($this->config,$config);  }  $this->bucket = C('OSS_TEST_BUCKET');  $this->ossClient = new OssClient(C('OSS_ACCESS_ID'), C('OSS_ACCESS_KEY'), C('OSS_ENDPOINT'), false);}

3.主函數

/** * 上傳所有文件 * @access public * @param string $savePath 上傳文件保存路徑 * @return string */public function upload($savePath ='') {  //如果不指定保存文件名,則由系統默認  if(empty($savePath)) {    $savePath = $this->savePath;  }  $fileInfo  = array();  $isUpload  = false;  // 獲取上傳的文件信息  // 對$_FILES數組信息處理  $files  =  $this->dealFiles($_FILES);  foreach($files as $key => $file) {    //過濾無效的上傳    if(!empty($file['name'])) {      //登記上傳文件的擴展信息      if(!isset($file['key']))  $file['key']  =  $key;      $file['extension'] =  $this->getExt($file['name']);      $file['savepath']  =  $savePath;      $file['savename']  =  $this->getSaveName($file);      // 自動檢查附件      if($this->autoCheck) {        if(!$this->check($file))          return false;      }      //保存上傳文件      if(!$this->save($file)) return false;      if(function_exists($this->hashType)) {        $fun = $this->hashType;        $file['hash']  = $fun($this->autoCharset($file['savepath'].$file['savename'],'utf-8','gbk'));      }      //上傳成功后保存文件信息,供其他地方調用      unset($file['tmp_name'],$file['error']);      $fileInfo[] = $file;      $isUpload  = true;    }  }  if($isUpload) {    $this->uploadFileInfo = $fileInfo;    return true;  }else {    $this->error = '沒有選擇上傳文件';    return false;  }}

4.核心處理函數

/** * 上傳一個文件 * @access public * @param mixed $name 數據 * @param string $value 數據表名 * @return string */private function save($file) {  $filename = $file['savepath'].$file['savename'];  if(!$this->uploadReplace && $this->doesObjectExist($filename)) {    // 不覆蓋同名文件    $this->error  =  '文件已經存在!'.$filename;    return false;  }  // 如果是圖像文件 檢測文件格式  if( in_array(strtolower($file['extension']),array('gif','jpg','jpeg','bmp','png','swf'))) {    $info  = getimagesize($file['tmp_name']);    if(false === $info || ('gif' == strtolower($file['extension']) && empty($info['bits']))){      $this->error = '非法圖像文件';      return false;    }  }  if(!$this->putObject($file['tmp_name'], $this->autoCharset($filename,'utf-8','gbk'))) {    $this->error = '文件上傳保存錯誤!';    return false;  }  if($this->thumb && in_array(strtolower($file['extension']),array('gif','jpg','jpeg','bmp','png'))) {    $image = getimagesize(C('OSS_IMG_URL').'/'.$filename);    if(false !== $image) {      //是圖像文件生成縮略圖      $thumbWidth   =  explode(',',$this->thumbMaxWidth);      $thumbHeight  =  explode(',',$this->thumbMaxHeight);      $thumbPrefix  =  explode(',',$this->thumbPrefix);      $thumbSuffix  =  explode(',',$this->thumbSuffix);      $thumbFile   =  explode(',',$this->thumbFile);      $thumbPath   =  $this->thumbPath?$this->thumbPath:dirname($filename).'/';      $thumbExt    =  $this->thumbExt ? $this->thumbExt : $file['extension']; //自定義縮略圖擴展名      // 生成圖像縮略圖      import($this->imageClassPath);      for($i=0,$len=count($thumbWidth); $i<$len; $i++) {        if(!empty($thumbFile[$i])) {          $thumbname =  $thumbFile[$i];        }else{          $prefix   =  isset($thumbPrefix[$i])?$thumbPrefix[$i]:$thumbPrefix[0];          $suffix   =  isset($thumbSuffix[$i])?$thumbSuffix[$i]:$thumbSuffix[0];          $thumbname =  $prefix.basename($filename,'.'.$file['extension']).$suffix;        }        $this->thumb(C('OSS_IMG_URL').'/'.$filename,$thumbPath.$thumbname.'.'.$thumbExt,'',$thumbWidth[$i],$thumbHeight[$i],true);      }      if($this->thumbRemoveOrigin) {        // 生成縮略圖之后刪除原圖        $this->deleteObject($filename);      }    }  }  if($this->zipImags) {    // TODO 對圖片壓縮包在線解壓  }  return true;}/** * 生成縮略圖 * @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 */public 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);    imagePNG($thumbImg,'Uploads/file.png'); // 中轉站    // 生成圖片    $this->putObject('Uploads/file.png',$thumbname);    imagedestroy($thumbImg);    imagedestroy($srcImg);    return $thumbname;  }  return false;}

5.輔助函數

/*** 轉換上傳文件數組變量為正確的方式* @access private* @param array $files 上傳的文件變量* @return array*/private function dealFiles($files) {    $fileArray = array();    $n     = 0;    foreach ($files as $key=>$file){      if(is_array($file['name'])) {        $keys    =  array_keys($file);        $count   =  count($file['name']);        for ($i=0; $i<$count; $i++) {          $fileArray[$n]['key'] = $key;          foreach ($keys as $_key){            $fileArray[$n][$_key] = $file[$_key][$i];          }          $n++;        }      }else{        $fileArray[$key] = $file;      }    }    return $fileArray;}/*** 檢查上傳的文件* @access private* @param array $file 文件信息* @return boolean*/private function check($file) {    if($file['error']!== 0) {      //文件上傳失敗      //捕獲錯誤代碼      $this->error($file['error']);      return false;    }    //文件上傳成功,進行自定義規則檢查    //檢查文件大小    if(!$this->checkSize($file['size'])) {      $this->error = '上傳文件大小不符!';      return false;    }    //檢查文件Mime類型    if(!$this->checkType($file['type'])) {      $this->error = '上傳文件MIME類型不允許!';      return false;    }    //檢查文件類型    if(!$this->checkExt($file['extension'])) {      $this->error ='上傳文件類型不允許';      return false;    }    //檢查是否合法上傳    if(!$this->checkUpload($file['tmp_name'])) {      $this->error = '非法上傳文件!';      return false;    }    return true;}// 自動轉換字符集 支持數組轉換private function autoCharset($fContents, $from='gbk', $to='utf-8') {    $from  = strtoupper($from) == 'UTF8' ? 'utf-8' : $from;    $to   = strtoupper($to) == 'UTF8' ? 'utf-8' : $to;    if (strtoupper($from) === strtoupper($to) || empty($fContents) || (is_scalar($fContents) && !is_string($fContents))) {      //如果編碼相同或者非字符串標量則不轉換      return $fContents;    }    if (function_exists('mb_convert_encoding')) {      return mb_convert_encoding($fContents, $to, $from);    } elseif (function_exists('iconv')) {      return iconv($from, $to, $fContents);    } else {      return $fContents;    }}/*** 檢查上傳的文件類型是否合法* @access private* @param string $type 數據* @return boolean*/private function checkType($type) {    if(!empty($this->allowTypes))      return in_array(strtolower($type),$this->allowTypes);    return true;}/*** 檢查上傳的文件后綴是否合法* @access private* @param string $ext 后綴名* @return boolean*/private function checkExt($ext) {    if(!empty($this->allowExts))      return in_array(strtolower($ext),$this->allowExts,true);    return true;}/*** 檢查文件大小是否合法* @access private* @param integer $size 數據* @return boolean*/private function checkSize($size) {    return !($size > $this->maxSize) || (-1 == $this->maxSize);}/*** 檢查文件是否非法提交* @access private* @param string $filename 文件名* @return boolean*/private function checkUpload($filename) {    return is_uploaded_file($filename);}/*** 取得上傳文件的后綴* @access private* @param string $filename 文件名* @return boolean*/private function getExt($filename) {    $pathinfo = pathinfo($filename);    return $pathinfo['extension'];}/*** 取得上傳文件的信息* @access public* @return array*/public function getUploadFileInfo() {    return $this->uploadFileInfo;}/*** 取得最后一次錯誤信息* @access public* @return string*/public function getErrorMsg() {    return $this->error;}

總結:與普通上傳的區別在于,它是全部通過阿里云的oss接口來處理文件保存的。普通上傳是把本地文件移動到服務器上,而它則是把文件移動到阿里云服務器上。

縮略圖思路:

a.上傳圖片至服務器
b.獲取圖片進行處理
c.上傳處理好的圖片至服務器
d.根據配置,刪除或者不刪除服務器的原圖(OSS)

imagePNG($thumbImg,'Uploads/file.png'); // 中轉站// 生成圖片$this->putObject('Uploads/file.png',$thumbname);unlink('Uploads/file.png');imagedestroy($thumbImg);希望本文所述對大家PHP程序設計有所幫助。


注:相關教程知識閱讀請移步到PHP教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 雷波县| 黑龙江省| 瑞金市| 资阳市| 维西| 抚顺市| 溧阳市| 若尔盖县| 宁波市| 华阴市| 孙吴县| 封开县| 三河市| 龙海市| 衡水市| 土默特右旗| 福安市| 年辖:市辖区| 六枝特区| 望奎县| 蓬安县| 酒泉市| 丽江市| 梁河县| 老河口市| 谢通门县| 南溪县| 博湖县| 晋宁县| 河西区| 垦利县| 迁西县| 定州市| 双鸭山市| 咸宁市| 永昌县| 开阳县| 都昌县| 黄大仙区| 武功县| 平邑县|