node上傳檔案或者整體資料夾到阿里OSS伺服器流程
阿新 • • 發佈:2018-12-04
官網介紹:OSSnode上傳檔案
node上傳檔案功能首先需要開許可權,即擁有上傳到伺服器的許可權,及對應的ID和secret,下面是OSS官網中介紹的node上傳檔案到OSS伺服器的步驟
let OSS = require('ali-oss') let client = new OSS({ region: '<Your region>', accessKeyId: '<Your AccessKeyId>', accessKeySecret: '<Your AccessKeySecret>', bucket: 'Your bucket name' }); async function put () { try { let result = await client.put('object-name', 'local-file'); console.log(result); } catch (e) { console.log(er); } } put();
client是node對OSS伺服器操作的必須品,所以格式一定要寫對,才可以使用OSS伺服器的一些功能
var client = new OSS({
region: 'oss-cn-beijing',//地域節點
accessKeyId: '*********',
accessKeySecret: '*******************',
bucket: 'hahaha'//域名
});
部分region,region項填入Region英文表示,詳細見訪問域名和資料中心
Region中文名稱 | Region英文表示 | 外網Endpoint | 外網支援HTTPS | ECS訪問的內網Endpoint | 內網支援HTTPS |
---|---|---|---|---|---|
華東 1 | oss-cn-hangzhou | oss-cn-hangzhou.aliyuncs.com | 是 | oss-cn-hangzhou-internal.aliyuncs.com | 是 |
華東 2 | oss-cn-shanghai | oss-cn-shanghai.aliyuncs.com | 是 | oss-cn-shanghai-internal.aliyuncs.com | 是 |
華北 1 | oss-cn-qingdao | oss-cn-qingdao.aliyuncs.com | 是 | oss-cn-qingdao-internal.aliyuncs.com | 是 |
華北 2 | oss-cn-beijing | oss-cn-beijing.aliyuncs.com | 是 | oss-cn-beijing-internal.aliyuncs.com | 是 |
華北 3 | oss-cn-zhangjiakou | oss-cn-zhangjiakou.aliyuncs.com | 是 | oss-cn-zhangjiakou-internal.aliyuncs.com | 是 |
華北 5 | oss-cn-huhehaote | oss-cn-huhehaote.aliyuncs.com | 是 | oss-cn-huhehaote-internal.aliyuncs.com | 是 |
華南 1 | oss-cn-shenzhen | oss-cn-shenzhen.aliyuncs.com | 是 | oss-cn-shenzhen-internal.aliyuncs.com | 是 |
Bucket是OSS上的名稱空間,許可權控制、日誌記錄等高階功能的管理實體;Bucket名稱在整個OSS服務中具有全域性唯一性,且不能修改;儲存在OSS上的每個Object必須都包含在某個Bucket中。
可以看出官網給出的僅僅只有上傳單個檔案的功能,上傳整體資料夾並沒有提及,而且是路徑上傳,所以要上傳整個資料夾,需要找到所以的檔案,然後上傳各自的路徑就可以了
async function putOSS (src,dist) {
try {
let result = await client.put(dist, src);
console.log(result);
} catch (e) {
console.log(e);
}
}
function addFileToOSSSync(src,dist){
var docs = fs.readdirSync(src);
docs.forEach(function(doc){
var _src = src + '/' + doc,
_dist = dist + '/' + doc;
var st = fs.statSync( _src);
// 判斷是否為檔案
if( st.isFile()&&doc!=='.DS_Store' ){
putOSS(_src,_dist);
// console.log(_src+'是檔案',_dist)
}
// 如果是目錄則遞迴呼叫自身
else if( st.isDirectory() ){
// console.log(_src+'是資料夾')
addFileToOSSSync( _src,_dist);
}
})
}
addFileToOSSSync(global.glopwd + "/File/dist",'hahaha')
整體思路就是用回撥的方式找出所有檔案,然後上傳到伺服器,但是找出所有的檔案就必須用到遞迴,判斷是否為資料夾,如果為資料夾再去找資料夾下的所有檔案,最後所有找到檔案之後,每個檔案單獨使用官網提供的putOSS函式上傳就可以了
需要注意的是上傳伺服器的路徑問題,OSS是沒有路徑概念的,但是由虛擬路徑去模擬的,所以上傳一個檔案到伺服器中
putOSS (src,'haha/zz.zip')
putOSS (src,'haha/heihei/zz.zip')
這兩種都可以上傳,但是對應的虛擬路徑在被訪問時會轉換為真實路徑,所以要上傳整個資料夾時,虛擬路徑的層級關係千萬要對應好!否則相互依賴的兩個檔案就會訪問不到