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