thinkphp集成系列之阿里雲oss

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

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

如果上傳的文件都和網站程序源代碼放在一起;那是有相當多的弊端的;

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

2:服務器的成本略高;

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

當一個神奇的“雲”時代的到來後;一切就變的更加簡單了;

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

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

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

一:準備工作

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/p_w_picpath/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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章