찾다
백엔드 개발PHP 튜토리얼PHP 파일 업로드를 위해 Alibaba Cloud OSS 사용

이 글에서는 주로 Alibaba Cloud OSS 이미지 업로드 클래스의 PHP 버전을 소개하고, Alibaba Cloud OSS 이미지 업로드 클래스의 PHP 버전에 대한 기능, 정의, 사용 방법 및 관련 주의 사항을 구체적인 예의 형태로 분석합니다. 도움이 필요한 친구들이 참고하면 좋을 것 같아요.

자세한 내용은 다음과 같습니다.

1. Alibaba Cloud 기본 기능

/**
 * 把本地变量的内容到文件
 * 简单上传,上传指定变量的内存值作为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);
}

4. 핵심 처리 기능

/**
 * 上传所有文件
 * @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;
  }
}

5.

요약:

과 일반 업로드의 차이점은 모두 Alibaba Cloud의 OSS 인터페이스를 통해 파일 저장을 처리한다는 것입니다. 일반 업로드는 로컬 파일을 서버로 이동하고 파일을 Alibaba Cloud 서버로 이동합니다.

썸네일 아이디어:

a. 이미지를 서버에 업로드합니다.

b. 처리할 이미지를 가져옵니다.

c. 원본 이미지를 삭제하거나 삭제하지 않습니다. 구성에 따른 서버(OSS)

/**
 * 上传一个文件
 * @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,&#39;.&#39;.$file[&#39;extension&#39;]).$suffix;
        }
        $this->thumb(C(&#39;OSS_IMG_URL&#39;).&#39;/&#39;.$filename,$thumbPath.$thumbname.&#39;.&#39;.$thumbExt,&#39;&#39;,$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=&#39;&#39;, $maxWidth=200, $maxHeight=50, $interlace=true) {
  // 获取原图信息
  $info = Image::getImageInfo($image);
  if ($info !== false) {
    $srcWidth = $info[&#39;width&#39;];
    $srcHeight = $info[&#39;height&#39;];
    $type = empty($type) ? $info[&#39;type&#39;] : $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 = &#39;ImageCreateFrom&#39; . ($type == &#39;jpg&#39; ? &#39;jpeg&#39; : $type);
    if(!function_exists($createFun)) {
      return false;
    }
    $srcImg = $createFun($image);
    //创建缩略图
    if ($type != &#39;gif&#39; && function_exists(&#39;imagecreatetruecolor&#39;))
      $thumbImg = imagecreatetruecolor($width, $height);
    else
      $thumbImg = imagecreate($width, $height);
     //png和gif的透明处理 by luofei614
    if(&#39;png&#39;==$type){
      imagealphablending($thumbImg, false);//取消默认的混色模式(为解决阴影为绿色的问题)
      imagesavealpha($thumbImg,true);//设定保存完整的 alpha 通道信息(为解决阴影为绿色的问题)
    }elseif(&#39;gif&#39;==$type){
      $trnprt_indx = imagecolortransparent($srcImg);
       if ($trnprt_indx >= 0) {
          //its transparent
          $trnprt_color = imagecolorsforindex($srcImg , $trnprt_indx);
          $trnprt_indx = imagecolorallocate($thumbImg, $trnprt_color[&#39;red&#39;], $trnprt_color[&#39;green&#39;], $trnprt_color[&#39;blue&#39;]);
          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 (&#39;jpg&#39; == $type || &#39;jpeg&#39; == $type)
      imageinterlace($thumbImg, $interlace);
    imagePNG($thumbImg,&#39;Uploads/file.png&#39;); // 中转站
    // 生成图片
    $this->putObject(&#39;Uploads/file.png&#39;,$thumbname);
    imagedestroy($thumbImg);
    imagedestroy($srcImg);
    return $thumbname;
  }
  return false;
}


관련 권장 사항:

Yii2.0 Alibaba Cloud OSS를 통합하여 단일 파일을 삭제하는 방법에 대한 자세한 예

thinkPHP의 간단한 방법에 대한 자세한 소개 Alibaba Cloud OSSsdk 가져오기 및 사용

PHP 애플리케이션 Qiniu Cloud의 리디렉션 업로드 및 콜백 업로드 예시 공유

위 내용은 PHP 파일 업로드를 위해 Alibaba Cloud OSS 사용의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
php怎么把负数转为正整数php怎么把负数转为正整数Apr 19, 2022 pm 08:59 PM

php把负数转为正整数的方法:1、使用abs()函数将负数转为正数,使用intval()函数对正数取整,转为正整数,语法“intval(abs($number))”;2、利用“~”位运算符将负数取反加一,语法“~$number + 1”。

php怎么实现几秒后执行一个函数php怎么实现几秒后执行一个函数Apr 24, 2022 pm 01:12 PM

实现方法:1、使用“sleep(延迟秒数)”语句,可延迟执行函数若干秒;2、使用“time_nanosleep(延迟秒数,延迟纳秒数)”语句,可延迟执行函数若干秒和纳秒;3、使用“time_sleep_until(time()+7)”语句。

php怎么除以100保留两位小数php怎么除以100保留两位小数Apr 22, 2022 pm 06:23 PM

php除以100保留两位小数的方法:1、利用“/”运算符进行除法运算,语法“数值 / 100”;2、使用“number_format(除法结果, 2)”或“sprintf("%.2f",除法结果)”语句进行四舍五入的处理值,并保留两位小数。

php怎么根据年月日判断是一年的第几天php怎么根据年月日判断是一年的第几天Apr 22, 2022 pm 05:02 PM

判断方法:1、使用“strtotime("年-月-日")”语句将给定的年月日转换为时间戳格式;2、用“date("z",时间戳)+1”语句计算指定时间戳是一年的第几天。date()返回的天数是从0开始计算的,因此真实天数需要在此基础上加1。

php字符串有没有下标php字符串有没有下标Apr 24, 2022 am 11:49 AM

php字符串有下标。在PHP中,下标不仅可以应用于数组和对象,还可应用于字符串,利用字符串的下标和中括号“[]”可以访问指定索引位置的字符,并对该字符进行读写,语法“字符串名[下标值]”;字符串的下标值(索引值)只能是整数类型,起始值为0。

php怎么判断有没有小数点php怎么判断有没有小数点Apr 20, 2022 pm 08:12 PM

php判断有没有小数点的方法:1、使用“strpos(数字字符串,'.')”语法,如果返回小数点在字符串中第一次出现的位置,则有小数点;2、使用“strrpos(数字字符串,'.')”语句,如果返回小数点在字符串中最后一次出现的位置,则有。

php怎么替换nbsp空格符php怎么替换nbsp空格符Apr 24, 2022 pm 02:55 PM

方法:1、用“str_replace("&nbsp;","其他字符",$str)”语句,可将nbsp符替换为其他字符;2、用“preg_replace("/(\s|\&nbsp\;||\xc2\xa0)/","其他字符",$str)”语句。

php怎么读取字符串后几个字符php怎么读取字符串后几个字符Apr 22, 2022 pm 08:31 PM

在php中,可以使用substr()函数来读取字符串后几个字符,只需要将该函数的第二个参数设置为负值,第三个参数省略即可;语法为“substr(字符串,-n)”,表示读取从字符串结尾处向前数第n个字符开始,直到字符串结尾的全部字符。

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

Dreamweaver Mac版

Dreamweaver Mac版

시각적 웹 개발 도구

SublimeText3 Linux 새 버전

SublimeText3 Linux 새 버전

SublimeText3 Linux 최신 버전

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

SublimeText3 영어 버전

SublimeText3 영어 버전

권장 사항: Win 버전, 코드 프롬프트 지원!

ZendStudio 13.5.1 맥

ZendStudio 13.5.1 맥

강력한 PHP 통합 개발 환경