首页后端开发PHP详解php版阿里云OSS图片上传类

详解php版阿里云OSS图片上传类

时间2024-02-02 10:31:02发布访客分类PHP浏览698
导读:收集整理的这篇文章主要介绍了详解php版阿里云OSS图片上传类,觉得挺不错的,现在分享给大家,也给大家做个参考。本文实例讲述了phP版阿里云OSS@R_863_1265@。分享给大家供大家参考,具体如下:【相关学习推荐:PHP编程(视频)】...
收集整理的这篇文章主要介绍了详解php版阿里云OSS图片上传类,觉得挺不错的,现在分享给大家,也给大家做个参考。

本文实例讲述了phP版阿里云OSS@R_863_1265@。分享给大家供大家参考,具体如下:

【相关学习推荐:PHP编程(视频)】

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版阿里云OSS图片上传类的详细内容,更多请关注其它相关文章!

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!


若转载请注明出处: 详解php版阿里云OSS图片上传类
本文地址: https://pptw.com/jishu/596723.html
【记录】PHP-fpm占CPU 100%修复 值得一看!高级PHP工程师必备的编码技巧及思维

游客 回复需填写必要信息