李东's Blog

李东

laravel使用阿里云oos教程

1947
2022-07-21
laravel使用阿里云oos教程
  1. 先用composer下载安装扩展包

    composer require "johnlui/aliyun-oss"
    

    安装完成之后的设置
    在app目录下建立:App\services\OSS 目录

    <?php
    namespace App\services;
    use JohnLui\AliyunOSS;
    use Exception;
    use DateTime;
    class OSS {
     /* 城市名称:
      *
      *  经典网络下可选:杭州、上海、青岛、北京、张家口、深圳、香港、硅谷、弗吉尼亚、新加坡、悉尼、日本、法兰克福、迪拜
      *  VPC 网络下可选:杭州、上海、青岛、北京、张家口、深圳、硅谷、弗吉尼亚、新加坡、悉尼、日本、法兰克福、迪拜
      */
     private $city = '上海';
     // 经典网络 or VPC
     private $networkType = '经典网络';
    
     private $AccessKeyId = 'LTAI5tKXjorberceJii3UL2D';
     private $AccessKeySecret = 'byiFFJGuy4sK5gNTjC0lZlhP5H85cD';
     private $ossClient;
     /**
      * 私有初始化 API,非 API,不用关注
      * @param boolean 是否使用内网
      */
     public function __construct($isInternal = false)
     {
         if ($this->networkType == 'VPC' && !$isInternal) {
             throw new Exception("VPC 网络下不提供外网上传、下载等功能");
         }
         $this->ossClient = AliyunOSS::boot(
             $this->city,
             $this->networkType,
             $isInternal,
             $this->AccessKeyId,
             $this->AccessKeySecret
         );
     }
     /**
      * 使用外网上传文件
      * @param  string bucket名称
      * @param  string 上传之后的 OSS object 名称
      * @param  string 上传文件路径
      * @return boolean 上传是否成功
      */
     public static function publicUpload($bucketName, $ossKey, $filePath, $options = [])
     {
         $oss = new OSS();
         $oss->ossClient->setBucket($bucketName);
         return $oss->ossClient->uploadFile($ossKey, $filePath, $options);
     }
     /**
      * 使用阿里云内网上传文件
      * @param  string bucket名称
      * @param  string 上传之后的 OSS object 名称
      * @param  string 上传文件路径
      * @return boolean 上传是否成功
      */
     public static function privateUpload($bucketName, $ossKey, $filePath, $options = [])
     {
         $oss = new OSS(true);
         $oss->ossClient->setBucket($bucketName);
         return $oss->ossClient->uploadFile($ossKey, $filePath, $options);
     }
     /**
      * 使用外网直接上传变量内容
      * @param  string bucket名称
      * @param  string 上传之后的 OSS object 名称
      * @param  string 上传的变量
      * @return boolean 上传是否成功
      */
     public static function publicUploadContent($bucketName, $ossKey, $content, $options = [])
     {
         $oss = new OSS();
         $oss->ossClient->setBucket($bucketName);
         return $oss->ossClient->uploadContent($ossKey, $content, $options);
     }
     /**
      * 使用阿里云内网直接上传变量内容
      * @param  string bucket名称
      * @param  string 上传之后的 OSS object 名称
      * @param  string 上传的变量
      * @return boolean 上传是否成功
      */
     public static function privateUploadContent($bucketName, $ossKey, $content, $options = [])
     {
         $oss = new OSS(true);
         $oss->ossClient->setBucket($bucketName);
         return $oss->ossClient->uploadContent($ossKey, $content, $options);
     }
     /**
      * 使用外网删除文件
      * @param  string bucket名称
      * @param  string 目标 OSS object 名称
      * @return boolean 删除是否成功
      */
     public static function publicDeleteObject($bucketName, $ossKey)
     {
         $oss = new OSS();
         $oss->ossClient->setBucket($bucketName);
         return $oss->ossClient->deleteObject($bucketName, $ossKey);
     }
     /**
      * 使用阿里云内网删除文件
      * @param  string bucket名称
      * @param  string 目标 OSS object 名称
      * @return boolean 删除是否成功
      */
     public static function privateDeleteObject($bucketName, $ossKey)
     {
         $oss = new OSS(true);
         $oss->ossClient->setBucket($bucketName);
         return $oss->ossClient->deleteObject($bucketName, $ossKey);
     }
     # 下面不再分公网内网出 API,也不注释了,大家自行体会吧
     public function copyObject($sourceBuckt, $sourceKey, $destBucket, $destKey)
     {
         $oss = new OSS();
         return $oss->ossClient->copyObject($sourceBuckt, $sourceKey, $destBucket, $destKey);
     }
     public function moveObject($sourceBuckt, $sourceKey, $destBucket, $destKey)
     {
         $oss = new OSS();
         return $oss->ossClient->moveObject($sourceBuckt, $sourceKey, $destBucket, $destKey);
     }
     // 获取公开文件的 URL
     public static function getPublicObjectURL($bucketName, $ossKey)
     {
         $oss = new OSS();
         $oss->ossClient->setBucket($bucketName);
         return $oss->ossClient->getPublicUrl($ossKey);
     }
     // 获取私有文件的URL,并设定过期时间,如 \DateTime('+1 day')
     public static function getPrivateObjectURLWithExpireTime($bucketName, $ossKey, DateTime $expire_time)
     {
         $oss = new OSS();
         $oss->ossClient->setBucket($bucketName);
         return $oss->ossClient->getUrl($ossKey, $expire_time);
     }
     public static function createBucket($bucketName)
     {
         $oss = new OSS();
         return $oss->ossClient->createBucket($bucketName);
     }
     public static function getAllObjectKey($bucketName)
     {
         $oss = new OSS();
         return $oss->ossClient->getAllObjectKey($bucketName);
     }
     public static function getObjectMeta($bucketName, $ossKey)
     {
         $oss = new OSS();
         return $oss->ossClient->getObjectMeta($bucketName, $ossKey);
     }
    }
    

    控制器使用代码
    先在控制器引入OOS

    use App\Services\OSS;
    
     //上传图片
     public function upload(Request $request){
         if ($request->isMethod('post')){
             $file   = $request->file('file');
             $allowed_extensions = ["png", "jpg","JPG","PNG","JPEG", "jpeg", "gif"];
             if($file){
                 if(!$file->isValid()) {
                     $result = array('msg' => '上传出错,请重试!', 'code'=>500);
                     return response()->json($result);
                 }
                 if ($file->getClientOriginalExtension() && !in_array($file->getClientOriginalExtension(), $allowed_extensions)) {
                     $result = array('msg' => '上传格式不对!', 'code'=>500);
                     return response()->json($result);
                 }
                 $img_path = $file -> getRealPath(); // 获取临时图片绝对路径
                 $entension = $file -> getClientOriginalExtension(); //  上传文件后缀
                 $filename = date('YmdHis').mt_rand(100,999).'.'.$entension;  // 重命名图片
                 $date = date('Y-m-d');
                 $filePath = 'uploads/images/'.$date.'/'.$filename;
                 //上传到阿里云服务器
                 $res=OSS::publicUpload('tea-demo',$filePath, $img_path,        ['ContentType'=>'image/jpeg']);
                 if($res){
                     $result = array('msg' => '上传成功!', 'code'=>200,'path'=>$filePath);
                     return response()->json($result);
                 }else{
                     $result = array('msg' => '上传失败!', 'code'=>500);
                     return response()->json($result);
                 }
             }else{
                 $result = array('msg' => '文件不存在!', 'code'=>500);
                 return response()->json($result);
             }
         }
     }