因爲最近的項目有兩臺機器一直處於負載均衡狀態,因此上傳的資源都不能直接傳到服務器後臺上,而是經過雲平臺進行交互,因此難免就涉及到不少上傳,下載的接口,因此專門記錄一下這一系列的過程。php
首先要把騰訊雲前端和後端的sdk加入到項目中,JS的sdk地址爲https://github.com/tencentyun/cos-js-sdk/tree/master/sdk,PHP的sdk地址爲https://github.com/tencentyun/cos-php-sdk(要包括Sign.php由於每次發請求都要傳送簽名進行驗證)同時爲了保證上傳文件的惟一性,因此會用到對整個文件內容進行md5處理的js,其位置爲https://github.com/forsigner/browser-md5-file/tree/master/dist,而且也簡單的講到其使用方法:前端
如今簡單的介紹一下其上傳和下載功能(前提是項目都已經成功的引入上述文件,具體其餘的功能如建立文件夾,刪除文件夾等功能能夠參考騰訊雲存儲的官方文檔https://www.qcloud.com/doc/product/430/5946)。git
1.上傳:github
首先我在前端頁面建立一個<input type='file'>類型的輸入,數據庫
在JS裏則是json
var bucketName = '你的騰訊雲Bucket名稱'; var cos = new CosCloud('你的騰訊雲app_id');//實例化一個cos對象
var params={}; 表單提交時 { var pic = $('#img_url').prop('files');//獲取上傳的文件信息
browserMD5File(pic[0], function (err, md5) //獲取文件的md5
{ var remotePath = '/image/' + md5 + "." + getSuffix(pic[0]['name']);//要上傳的路徑
cos.out_uploadFile(function(result)//成功回調
{ params['img_url'] = $.parseJSON(result).data.access_url;//騰訊雲的地址賦給這個字段更新到數據庫
}, function (result)//失敗回調
{ alert("上傳失敗!"); }, bucketName, remotePath, pic[0], 0); }); } //獲取文件的後綴名
function getSuffix(filename) { var names = filename.split('.'); return names[names.length - 1]; }
這樣就把騰訊雲回調的路徑傳給了params裏的字段傳到後端進行查數據庫處理,爲了更好地處理,官方建議把成功的回調和失敗的回調單獨寫成函數處理調用,bootstrap
這樣相對來講修改方便,推薦一下。後端
2.下載則通常來講是後端下載,直接訪問到文件的資源就能夠下載了,這個用原生的php處理均可以,在php裏引入對應的sdkapi
$cdn_url='你的騰訊雲資源的絕對路徑'; $filename=basename($cdn_url); //獲取文件名
$myFilePath='/app/public/'.$filename; //獲取本地文件路徑
set_time_limit (24 * 60 * 60); $cdnFile = fopen ($cdn_url, "rb"); if ($cdnFile) { $myFile= fopen($myFilePath, "wb"); if ($myFile) { while (!feof($cdnFile)) { fwrite($myFile, fread($cdnFile,1024 * 8),1024 * 8); } } fclose($cdnFile); if($myFile) { fclose($myFile); } }
這樣就在後端把騰訊雲的文件下載下來了,主要是藉助於php的fopen函數。跨域
3.獲取上傳進度:
在網頁定義一個進度條,引用自bootstrap的樣式
這個只要設置一個定時器定時修改progress-bar的width便可顯示加載的進度。前端JS獲取上傳進度的接口以下,在調試時一直報錯(後來發現是由於瀏覽器跨域了,因此就把Bucket進行跨域設置就把接口調通了,不過直接用後端發請求是不會出現這個問題的),因而
就用php端直接發一樣的請求:
$bucketName=‘你的Bucket名稱’; $remotePath=‘騰訊雲資源的路徑’; $result=Cosapi::stat($bucketName, $remotePath);//發請求返回結果return response()->json(['filelen'=>$result['data']['filelen']]);
前端在定時把後端傳過去的(這個值/文件長度)*100+「%」設置爲進度條的寬度便可。(吐槽一句,從後端發請求簡直容易太多,可是這個接口的回調有問題,進度條的進度從0%忽然變到100%,問了騰訊雲說是接口就是這樣,難道接口裏再獲取一個進度很難嗎???)
總的來講,其SDK的方法也很常見,基本都是增刪改查(文件、目錄)的功能,只要根據本身的需求調用對應的sdk方法便可,前提是js和php端都得先引入sdk文件才行。