1. 程式人生 > >node上傳檔案或者整體資料夾到阿里OSS伺服器流程

node上傳檔案或者整體資料夾到阿里OSS伺服器流程

官網介紹: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') 

這兩種都可以上傳,但是對應的虛擬路徑在被訪問時會轉換為真實路徑,所以要上傳整個資料夾時,虛擬路徑的層級關係千萬要對應好!否則相互依賴的兩個檔案就會訪問不到