thinkphp集成系列之阿里雲oss

web2.0時代;除了純信息展現類的網站;基本都是有文件上傳功能的;php

最不濟你得讓用戶換個頭像吧;可是隨着業務的發展;html

若是上傳的文件都和網站程序源代碼放在一塊兒;那是有至關多的弊端的;ios

1:靜態文件會佔用大量帶寬;git

2:服務器的成本略高;web

常規的作法是把php源代碼放到一臺服務器上;圖片等靜態文件放在另外一臺服務器上;thinkphp

當一個神奇的「雲」時代的到來後;一切就變的更加簡單了;服務器

在業務還比較小的時候;咱們無需大費周折的去搞一臺靜態文件服務器;直接使用第三方的便可;網絡

好了;洛裏囉嗦了半天;下面請出本篇博客的主角:阿里雲oss;框架

我就再也不安利oss的優點了;還沒了解過的先跟着這個連接走:https://www.aliyun.com/product/oss/ide

一:準備工做

1:申請key和secret

白俊遙博客

2:建立Bucket

白俊遙博客

須要注意的是要把讀寫權限改成: 公共讀;

 

白俊遙博客

根據服務器的位置獲取外網endpoint;https://help.aliyun.com/document_detail/31834.html

白俊遙博客

ok;湊齊了這些配置項;下面能夠召喚神龍了;

二:填寫配置項

依然是以項目示例:http://git.oschina.net/shuaibai123/thinkphp-bjyadmin

/Application/Common/Conf/config.php

    'ALIOSS_CONFIG'          => array(
        'KEY_ID'             => '', // 阿里雲oss key_id
        'KEY_SECRET'         => '', // 阿里雲oss key_secret
        'END_POINT'          => '', // 阿里雲oss endpoint
        'BUCKET'             => ''  // bucken 名稱
        ),

三:實例化並上傳

/Application/Common/Common/function.php

/**
 * 實例化阿里雲oos
 * @return object 實例化獲得的對象
 */
function new_oss(){
    vendor('Alioss.autoload');
    $config=C('ALIOSS_CONFIG');
    $oss=new \OSS\OssClient($config['KEY_ID'],$config['KEY_SECRET'],$config['END_POINT']);
    return $oss;
}

/**
 * 上傳文件到oss並刪除本地文件
 * @param  string $path 文件路徑
 * @return bollear      是否上傳
 */
function oss_upload($path){
    // 獲取配置項
    $bucket=C('ALIOSS_CONFIG.BUCKET');
    // 先統一去除左側的.或者/ 再添加./
    $oss_path=ltrim($path,'./');
    $path='./'.$oss_path;
    if (file_exists($path)) {
        // 實例化oss類
        $oss=new_oss();
        // 上傳到oss    
        $oss->uploadFile($bucket,$oss_path,$path);
        // 如需上傳到oss後 自動刪除本地的文件 則刪除下面的註釋 
        // unlink($path);
        return true;
    }
    return false;
}

 

ok如今首先使用框架的Upload上傳類上傳文件到服務器;得到文件路徑;

調用oss_upload()函數;傳入得到的文件路徑;便可把文件上傳到oss;

四:便捷方式

看第三步;咱們能夠發現;每上傳一個文件就要調用oss_upload()函數;

那可不能夠上傳文件之後自動就上傳到oss呢?

固然能夠了;可是咱們要對框架的Upload作點手術;

在 /ThinkPHP/Library/Think/Upload.class.php  的第229行添加以下代碼;

//*************************添加部分開始*************************
// 判斷是否上傳成功
if (!empty($info)) {
    // 獲取須要上傳到oss的目錄
    $need_upload_oos=C('NEED_UPLOAD_OSS');
    foreach ($info as $k => $v) {
        // 判斷此路徑是否須要上傳到oss
        foreach ($need_upload_oos as $m => $n) {
            if (strpos($v['savepath'], $n)!==false) {
                // 上傳到oss
                oss_upload($v['savepath'].$v['savename']);
                continue;
            }
        }                
    }

}
//*************************添加部分結束*************************

白俊遙博客

而後在配置項中設置哪些目錄的文件自動上傳到oss;

/Application/Common/Conf/config.php

'NEED_UPLOAD_OSS'        => array( // 須要上傳的目錄
    '/Upload/avatar',
    '/Upload/cover',
    '/Upload/image/webuploader',
    '/Upload/video',
    ),

若是隻有個別目不上傳、或者是全部目錄都上傳的;直接改配置項和Upload便可;

四:獲取文件連接

圖片之類的靜態文件是上傳到oss了;那連接怎麼獲取呢?

/Application/Common/Common/function.php

/**
 * 獲取完整網絡鏈接
 * @param  string $path 文件路徑
 * @return string       http鏈接
 */
function get_url($path){
    // 若是是空;返回空
    if (empty($path)) {
        return '';
    }
    // 若是已經有http直接返回
    if (strpos($path, 'http://')!==false) {
        return $path;
    }
    // 獲取bucket
    $bucket=C('ALIOSS_CONFIG.BUCKET');
    return 'http://'.$bucket.'.oss-cn-beijing.aliyuncs.com'.$path;
}

調用上面這個get_url()函數;傳入第三步獲取到的文件路徑;便可獲得oss的文件連接;

到此;從建立、上傳、獲取文件連接;整個流程就結束了;

若是要整合到本身有的項目中;

那隻須要把/ThinkPHP/Library/Vendor/Alioss文件夾拷貝到本身項目同目錄下;

把上面哪些配置項和函數拿過去就能夠直接用;

本文爲白俊遙原創文章,轉載無需和我聯繫,但請註明來自白俊遙博客http://baijunyao.com

相關文章
相關標籤/搜索