1. 程式人生 > >php 利用阿里雲oss實現託管檔案

php 利用阿里雲oss實現託管檔案

首先需要下載阿里雲的php版sdk,然後引入載入檔案autoload.php

以下是我在使用時封裝的class

<?php
include IA_ROOT . 'autoload.php';
use OSS\OssClient;  //引入名稱空間
use OSS\Core\OssException; //引入名稱空間
class Alioss{
    /**
     * 阿里雲 OSS雲端儲存類
     * 參考 阿里雲連結      https://help.aliyun.com/document_detail/32101.html?spm=5176.doc32103.6.758.d8QJSr
     * $accessKeyId         <從OSS獲得的    AccessKeyId>
     * $accessKeySecret     <從OSS獲得的    AccessKeySecret>
     * $endpoint            <選定的OSS資料中心訪問域名,例如  http://oss-cn-hangzhou.aliyuncs.com>
     * $bucket              <使用的儲存空間名稱,注意命名規範>
     * */
          private    $accessKeyId = "";//阿里雲統一$accessKeyId
          private    $accessKeySecret = "";//阿里雲統一$accessKeySecret
          private    $endpoint = "";// 新建的bucket的endpoint,測試使用
          private    $bucket = "";// 新建的bucket,測試使用

    /**
     * 新建一個儲存空間(Bucket)
     * $bucket  儲存空間名稱,名稱規範參考url:   https://help.aliyun.com/document_detail/31827.html?spm=5176.doc32101.2.5.PMp0so
     * */
    public function create_Bucket($bucket){
        $ossClient = new OssClient($this->accessKeyId, $this->accessKeySecret, $this->endpoint);
        $result = $ossClient->createBucket($bucket);
        if(is_array($result['info'])){
            return $result['info'];
        }else{
            return false;
        }

    }
    /**
     * 新建一個建立虛擬目錄(dir)
     * $bucket  儲存空間名稱,名稱規範參考url:   https://help.aliyun.com/document_detail/31827.html?spm=5176.doc32101.2.5.PMp0so
     * 已存在的資料夾不會覆蓋
     * */
    public function create_ObjectDir($dir){
        $ossClient = new OssClient($this->accessKeyId, $this->accessKeySecret, $this->endpoint);
        $result = $ossClient->createObjectDir($this->bucket,$dir);
        if(is_array($result)){
            return $result;
        }else{
            return false;
        }

    }
    /**
     * 上傳本地檔案至 OSS
     * $filename  需要上傳檔案的檔名及字尾   例:test.txt
     * $filename  可指定存放的資料夾,預設存放在$bucket主目錄下  例:test/test.txt
     * $path      需要上傳的本地檔案路徑,絕對路徑
     * */
    public function upload_File($filename,$path){
        $ossClient = new OssClient($this->accessKeyId, $this->accessKeySecret, $this->endpoint);
        $result = $ossClient->uploadFile($this->bucket, $filename,$path);
       if(is_array($result['info'])){
           return $result['info'];
       }else{
           return false;
       }

    }
    /**
     * 上傳變數到 OSS
     * $filename  需要上傳檔案的檔名及字尾   例:test.txt
     * $filename  可指定存放的資料夾,預設存放在$bucket主目錄下  例:test/test.txt
     * $content   變數內容,只支援字串格式。
     * */
    public function put_Object($filename,$content){
        $ossClient = new OssClient($this->accessKeyId, $this->accessKeySecret, $this->endpoint);
        $result = $ossClient->putObject($this->bucket, $filename, $content);
        if(is_array($result['info'])){
            return $result['info'];
        }else{
            return false;
        }
    }
    /**
     * 將檔案從伺服器下載到本地
     * $filename  需要下載的檔名(包含資料夾) 例:test/test.txt
     * $path   下載檔案的儲存路徑
     * 詳情參考  https://help.aliyun.com/document_detail/32104.html?spm=5176.doc32101.2.9.ieZCNh#h2-u4E0Bu8F7Du6587u4EF6u5230u672Cu5730u6587u4EF6
     * */
    public function get_Object($filename,$path){
        $ossClient = new OssClient($this->accessKeyId, $this->accessKeySecret, $this->endpoint);
        $options = array(
            OssClient::OSS_FILE_DOWNLOAD => $path,
        );
        $result=$ossClient->getObject($this->bucket, $filename, $options);
            return $result;
    }
    /**
     * 判斷object是否存在
     * $filename  object的檔名(包含資料夾) 例:test/test.txt
     * $result    返回值為ture時表示檔案存在,false檔案不存在。
     * */
    public function does_ObjectExist($filename){
 
        $ossClient = new OssClient($this->accessKeyId, $this->accessKeySecret, $this->endpoint);
        $result=$ossClient->doesObjectExist($this->bucket, $filename);
        return $result;
    }
    /**
     * 刪除object
     * $filename  object的檔名(包含資料夾) 例:test/test.txt
     * */
    public function delete_Object($filename){
        $ossClient = new OssClient($this->accessKeyId, $this->accessKeySecret, $this->endpoint);
        $result=$ossClient->deleteObject($this->bucket, $filename);
        if(is_array($result['info'])){
            return $result['info'];
        }else{
            return false;
        }
    }
    /**
     * 列出Bucket內所有目錄和檔案, 注意如果符合條件的檔案數目超過設定的max-keys, 使用者需要使用返回的nextMarker作為入參,通過
     * 迴圈呼叫ListObjects得到所有的檔案,具體操作見下面的 listAllObjects 示例
     *
     * @param OssClient $ossClient OssClient例項
     * @param string $bucket 儲存空間名稱
     * @return null
     */
    public function list_Objects($prefix='',$nextMarker='',$maxkeys=1000,$delimiter = '/'){
        $ossClient = new OssClient($this->accessKeyId, $this->accessKeySecret, $this->endpoint);
        //$prefix = 'black/';   //需要查詢的目錄
        //$delimiter = '/';       //去除資料夾
        //$nextMarker = '';     //從檔案為名為$nextMarker的下一條開始查詢。
        //$maxkeys = 1000;      //最大返回條數
        $options = array(
            'delimiter' => $delimiter,
            'prefix' => $prefix,
            'max-keys' => $maxkeys,
            'marker' => $nextMarker,
        );
        $listObjectInfo=$ossClient->listObjects($this->bucket, $options);
        $objectList = $listObjectInfo->getObjectList(); // 檔案列表
        if (!empty($objectList)) {
            foreach ($objectList as $objectInfo) {
                $filelist[]=$objectInfo->getKey();//檔案列表
            }
        }
            return $filelist;
    }
    /**
     * 列出Bucket內所有目錄和檔案, 注意如果符合條件的檔案數目超過設定的max-keys, 使用者需要使用返回的nextMarker作為入參,通過
     * 迴圈呼叫ListObjects得到所有的檔案,具體操作見下面的 listAllObjects 示例
     *
     * @param OssClient $ossClient OssClient例項
     * @param string $bucket 儲存空間名稱
     * @return null
     */
    public function list_dir_Objects($prefix='',$nextMarker='',$maxkeys=1000,$delimiter = '/'){
        $ossClient = new OssClient($this->accessKeyId, $this->accessKeySecret, $this->endpoint);
        //$prefix = 'black/';   //需要查詢的目錄,預設主目錄
        //$delimiter = '/';     //去除資料夾
        //$nextMarker = '';     //從檔案為名為$nextMarker的下一條開始查詢。
        //$maxkeys = 1000;      //最大返回條數
        $options = array(
            'delimiter' => $delimiter,
            'prefix' => $prefix,
            'max-keys' => $maxkeys,
            'marker' => $nextMarker,
        );
        $listObjectInfo=$ossClient->listObjects($this->bucket, $options);
        $prefixList = $listObjectInfo->getPrefixList(); // 目錄列表
        if (!empty($prefixList)) {
            foreach ($prefixList as $prefixInfo) {
                $dirlist[]=$prefixInfo->getPrefix();//資料夾列表
            }
        }

        return $dirlist;
    }


}