阿里云OSS对象存储的实现

使用了OSS,就可以实现数据和业务逻辑分离了,近期我用了一下阿里云的对象存储,感觉效果还不错,所以把常用的功能封装成了接口,方便调用,下面是代码,和大家分享。

<?php
namespace AliyunOss;
/**
 * Interface api
 * @package AliyunOss
 * 阿里云对象存储接口的实现
 * by sdxjwkq
 */
interface apiInterface{
    /**
     * @param $bucketName(存储空间名称)
     * @return array|null
     * @throws Exception
     * 创建存储空间
     */
    public function createBucketByName($bucketName);
    /**
     * @param $bucketName(存储空间名称)
     * @return array
     * @throws Exception
     * 删除存储空间
     */
    public function deleteBucketByName($bucketName);
    /**
     * @param $dirName(目录名)
     * @param $bucketName(存储空间名)
     * @return array
     * @throws Exception
     * 创建目录
     */
    public function createDirByName($dirName,$bucketName);
    /**
     * @param $dirName(目录名)
     * @param $bucketName(存储空间名)
     * @return array
     * @throws Exception
     * 删除目录
     */
    public function deleteDirByName($dirName,$bucketName);
    /**
     * @param $fileName(文件名)
     * @param $filePath(文件真实路径)
     * @param $bucketName(存储空间名)
     * @return array
     * @throws Exception
     * 文件上传
     */
    public function uploadFileByFileName($fileName,$filePath,$bucketName);
    /**
     * @param $fileName(文件名)
     * @param $bucketName(存储空间名)
     * @param $type(输出类型,文件:file,二进制流:stream)
     * @return array
     * @throws Exception
     * 文件下载
     */
    public function downloadFileByFileName($fileName,$bucketName,$type);
    /**
     * @param $bucketName(存储空间名)
     * @return array
     * @throws Exception
     * 枚举文件列表
     */
    public function getFileListByBucketname($bucketName);
    /**
     * @param $dirName(文件名,多文件请传入数组)
     * @param $bucketName(存储空间名)
     * @return array
     * @throws Exception
     * 删除文件(支持删除多个)
     */
    public function deleteFileByName($fileName,$bucketName);
    /**
     * @param $fileName(文件名)
     * @param $bucketName(存储空间名)
     * @return array
     * @throws Exception
     * 文件是否存在
     */
    public function fileExist($fileName,$bucketName);
    /**
     * @param $fromBucketName(原存储空间名)
     * @param $fromFileName(原文件名)
     * @param $toBucketName(新存储空间名)
     * @param $toFileName(新文件名)
     * @return array
     * @throws Exception
     * 复制文件
     */
    public function copyFile($fromBucketName,$fromFileName,$toBucketName,$toFileName);
    /**
     * @param $fileName(文件名)
     * @param $bucketName(存储空间名)
     * @return array
     * @throws Exception
     * 取得文件属性
     */
    public function getFileMeta($fileName,$bucketName);
}

/**
 * Class config
 * @package AliyunOss
 * 配置文件
 */
class config{
    const OSS_ACCESS_ID = '';//权限id
    const OSS_ACCESS_KEY = '';//权限秘钥
    const OSS_ENDPOINT = '';//oss服务器地址
}
/**
 * Class api
 * @package AliyunOss
 * 阿里云对象存储逻辑的实现
 * by sdxjwkq
 */
use OSS\OssClient;
use OSS\Core\OssException;
use Think\Exception;

class ossApi implements apiInterface{
    private $accessId=config::OSS_ACCESS_ID;
    private $accessKey=config::OSS_ACCESS_KEY;
    private $endpoint=config::OSS_ENDPOINT;

    /**
     * @param $bucketName(存储空间名称)
     * @return array|null
     * @throws Exception
     * 创建存储空间
     */
    public function createBucketByName($bucketName){
        $ossClient=$this->getOssSdk();
        try{
            $result=$this->success(
                $ossClient->createBucket($bucketName)
            );
        }catch(OssException $e){
            $result=$this->error(
                $e->getMessage()
            );
        }
        return $result;
    }

    /**
     * @param $bucketName(存储空间名称)
     * @return array
     * @throws Exception
     * 删除存储空间
     */
    public function deleteBucketByName($bucketName){
        $ossClient=$this->getOssSdk();
        try{
            $result=$this->success(
                $ossClient->deleteBucket($bucketName)
            );
        }catch(OssException $e){
            $result=$this->error(
                $e->getMessage()
            );
        }
        return $result;
    }

    /**
     * @param $dirName(目录名)
     * @param $bucketName(存储空间名)
     * @return array
     * @throws Exception
     * 创建目录
     */
    public function createDirByName($dirName,$bucketName){
        $ossClient=$this->getOssSdk();
        try{
            $result=$this->success(
                $ossClient->createObjectDir($bucketName,$dirName)
            );
        }catch(OssException $e){
            $result=$this->error(
                $e->getMessage()
            );
        }
        return $result;
    }
    /**
     * @param $dirName(目录名)
     * @param $bucketName(存储空间名)
     * @return array
     * @throws Exception
     * 删除目录
     */
    public function deleteDirByName($dirName,$bucketName){
        $ossClient=$this->getOssSdk();
        try{
            $result=$this->success(
                $ossClient->deleteObject($bucketName,$dirName)
            );
        }catch(OssException $e){
            $result=$this->error(
                $e->getMessage()
            );
        }
        return $result;
    }

    /**
     * @param $fileName(文件名)
     * @param $filePath(文件真实路径)
     * @param $bucketName(存储空间名)
     * @return array
     * @throws Exception
     * 文件上传
     */
    public function uploadFileByFileName($fileName,$filePath,$bucketName){
        $ossClient=$this->getOssSdk();
        try{
            $result=$this->success(
                $ossClient->uploadFile($bucketName,$fileName,$filePath)
            );
        }catch(OssException $e){
            $result=$this->error(
                $e->getMessage()
            );
        }
        return $result;
    }

    /**
     * @param $fileName(文件名)
     * @param $bucketName(存储空间名)
     * @param $type(输出类型,文件:file,二进制流:stream)
     * @return array
     * @throws Exception
     * 文件下载
     */
    public function downloadFileByFileName($fileName,$bucketName,$type){
        $ossClient=$this->getOssSdk();
        if($type=="file"){
            header("Content-Type: application/octet-stream");
            header("Accept-Ranges: bytes");
            header("Content-Disposition: attachment; filename=".$fileName);
        }
        try{
            die($ossClient->getObject($bucketName,$fileName));
        }catch(OssException $e){
            $result=$this->error(
                $e->getMessage()
            );
        }
        return $result;
    }

    /**
     * @param $bucketName(存储空间名)
     * @return array
     * @throws Exception
     * 枚举文件列表
     */
    public function getFileListByBucketname($bucketName){
        $ossClient=$this->getOssSdk();
        $fileList=array();//准备文件列表
        try{
            $listObjectInfo=$ossClient->listObjects($bucketName);
            $objectList = $listObjectInfo->getObjectList();
            foreach($objectList as $value){
                $fileList[]=[
                    "fileName"=>$value->getKey(),
                    "size"=>$value->getSize(),
                    "lastModified"=>$value->getLastModified(),
                    "eTag"=>$value->getETag(),
                    "type"=>$value->getType(),
                    "storageClass"=>$value->getStorageClass()
                ];
            }
            $result=$this->success(
                $fileList
            );
        }catch(OssException $e){
            $result=$this->error(
                $e->getMessage()
            );
        }
        return $result;
    }
    /**
     * @param $dirName(文件名,多文件请传入数组)
     * @param $bucketName(存储空间名)
     * @return array
     * @throws Exception
     * 删除文件(支持删除多个)
     */
    public function deleteFileByName($fileName,$bucketName){
        if(!is_array($fileName)){
            $fileName=[$fileName];//兼容多文件上传
        }
        $ossClient=$this->getOssSdk();
        try{
            $result=$this->success(
                $ossClient->deleteObjects($bucketName,$fileName)
            );
        }catch(OssException $e){
            $result=$this->error(
                $e->getMessage()
            );
        }
        return $result;
    }

    /**
     * @param $fileName(文件名)
     * @param $bucketName(存储空间名)
     * @return array
     * @throws Exception
     * 文件是否存在
     */
    public function fileExist($fileName,$bucketName){
        $ossClient=$this->getOssSdk();
        try{
            $result=$this->success(
                $ossClient->doesObjectExist($bucketName,$fileName)
            );
        }catch(OssException $e){
            $result=$this->error(
                $e->getMessage()
            );
        }
        return $result;
    }

    /**
     * @param $fromBucketName(原存储空间名)
     * @param $fromFileName(原文件名)
     * @param $toBucketName(新存储空间名)
     * @param $toFileName(新文件名)
     * @return array
     * @throws Exception
     * 复制文件
     */
    public function copyFile($fromBucketName,$fromFileName,$toBucketName,$toFileName){
        $ossClient=$this->getOssSdk();
        try{
            $result=$this->success(
                $ossClient->copyObject($fromBucketName,$fromFileName,$toBucketName,$toFileName)
            );
        }catch(OssException $e){
            $result=$this->error(
                $e->getMessage()
            );
        }
        return $result;
    }

    /**
     * @param $fileName(文件名)
     * @param $bucketName(存储空间名)
     * @return array
     * @throws Exception
     * 取得文件属性
     */
    public function getFileMeta($fileName,$bucketName){
        $ossClient=$this->getOssSdk();
        try{
            $result=$this->success(
                $ossClient->getObjectMeta($bucketName,$fileName)
            );
        }catch(OssException $e){
            $result=$this->error(
                $e->getMessage()
            );
        }
        return $result;
    }
    /
    //内部方法
    /**
     * 取得SDK句柄
     */
    private function getOssSdk(){
        require_once __DIR__."/autoload.php";
        try {
            $ossClient = new OssClient($this->accessId, $this->accessKey, $this->endpoint);
        } catch (OssException $e) {
            throw new Exception($e->getMessage());
        }
        return $ossClient;
    }

    /**
     * @param $data
     * @return array
     * 执行成功
     */
    private function success($data){
        return [
            "status"=>"success",
            "data"=>$data
        ];
    }

    /**
     * @param $data
     * @return array
     * 执行失败
     */
    private function error($data){
        return [
            "status"=>"error",
            "data"=>$data
        ];
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值