閱讀957 返回首頁    go 網易 go 網易蜂巢


對象存儲 Node SDK

目錄

安裝

SDK

曆史版本: 無

環境要求

建議node.js v4.4+ 使用以下命令顯示當前的node.js版本:

$ node -v

安裝

使用NPM安裝

首先使用npm安裝SDK的開發包:

npm install nos-node-sdk

初始化

確定EndPoint

EndPoint 是NOS各個區域的地址,目前支持以下形式

EndPoint類型 備注
NOS區域域名地址 使用桶所在的區域的NOS域名地址


NOS區域域名地址

進入NOS控製台,在桶的 屬性 中可以查找到當前桶所在的區域及域名,桶的域名的後綴部分為 該桶的公網域名,例如:test-logging.nos-eastchina1.126.net中的nos-eastchina1.126.net 為該桶的公網EndPoint。

配置秘鑰

要接入NOS服務,你需要一對有效的AccessKey(包括AccessKeyId與AccessKeySecret)來進行 簽名驗證,開通服務與AccessKey請參考 訪問控製

在獲取到AccessKeyId與AccessKeySecret之後,可以按照以下的步驟進行初始化

使用方法

使用步驟

1.安裝nos-node-sdk模塊:

npm install nos-node-sdk

2.引入模塊 nos-node-sdk 模塊:

var NosClient = require('nos-node-sdk');

3.初始化 NosClient:

var nosclient = new NosClient();
nosclient.setAccessId('你的accessKeyId');
nosclient.setSecretKey('你的accessKeySecret');
nosclient.setEndpoint('建桶時選擇的的區域域名');
nosclient.setPort('80');

使用說明

    1.nos-node-sdk提供callback風格的api接口,所有的api都有兩個參數,示例如下:

var map = {
    bucket: 'bucketName', //桶名
    key: 'objectName', //對象名
    filepath: 'path' //本地文件路徑
};
var cb = function(result) {
    console.log(result);
};

try {
    nosclient.put_file(map, cb);
}
    catch(err) {
    console.log("Failed with code:" + err.code);
}

    *第一個參數是map,不同的接口要求傳入的map參數不一樣。

    *第二個參數是回調函數cb,cb中的操作由用戶自行定義,在收到響應的時候由sdk自動調用,並傳入一個result參數,該參數提供的內容在不同的api中有所不同。用戶可以在自定義cb的時候利用該參數獲取響應的內容,如uploadid,etag等等。

    2.使用sdk時,用戶隻需要按照文檔要求提供合法的map參數和定義cb,就能方便調用nos接口通過node管理資源。NOS Node SDK主要描述各個api的map參數和cb函數的result參數的內容,並提供使用示例。

    3.當接口調用失敗,返回狀態碼不在[200,400)範圍時,sdk會拋出異常,異常包含的信息請參考 異常信息

快速入門

使用NOS Node SDK前,你可以先參照 API 手冊 熟悉NOS的基本概念,如Bucket、Object、EndPoint、AccessKeyId和AccessKeySecret等。 本節你將看到如何快速的使用NOS Node SDK,完成常用的操作,上傳文件、下載文件等。

基本操作

上傳文件

對象(Object)是NOS中最基本的數據單元,你可以把它簡單的理解為文件,以下代碼可以實現簡單的對象上傳:

var map = {
    bucket: 'bucketName', //桶名
    key: 'objectName', //對象名
    filepath: 'path' //本地文件路徑
};
var cb = function(result) {
    console.log(result);
};

try {
    nosclient.put_file(map, cb);
}
    catch(err) {
    console.log("Failed with code:" + err.code);
}

對象命名規則請參見 API 手冊 對象

更多的上傳文件信息,請參見 NOS Node SDK上傳文件

下載文件

上傳對象成功之後,你可以讀取它的內容,以下代碼可以實現文件的下載:

var map = {
    bucket: 'bucketName', //桶名
    key: 'objectName', //對象名
    path: 'destpath' //下載到的本地文件路徑(包含文件名)
};
var cb = function(result) {
    console.log(result);
}

try {
    nosclient.get_object_file(map, cb) //這裏的destpath包括了文件名
}
    catch(err) {
    console.log("Failed with code: " + err.code);
}

更多的下載文件信息,請參見 NOS Node SDK下載文件

列舉文件

當上傳文件成功之後,可以查看桶中包含的文件列表,以下代碼展示如何列舉桶內的文件:

var map = {
    bucket: 'bucketName' //桶名
};
var cb = function(result) {
    //獲取對象列表
    var objectlist = result['bucketInfo']['objectlist'];
    //遍曆對象列表
    for (var i = 0; i < objectlist.length; i++) {
        //打印對象信息
        console.log(objectlist[i]['key']);
        console.log(objectlist[i]['lastmodified']);
        console.log(objectlist[i]['etag']);
        console.log(objectlist[i]['size']);
    }
}

try {
    nosclient.list_objects(map, cb);
}
    catch(err) {
    console.log("Failed with code:" + err.code);
}

上麵的代碼默認列舉100個object

更多的管理文件信息,請參見 NOS Node SDK 文件管理

刪除文件

文件上傳成功後,可以指定刪除桶中的文件,以下代碼實現桶中文件的刪除:

var map = {
    bucket: 'bucketName', //桶名
    key: 'objectName' //對象名
};
var cb = function(result) {
    //打印statusCode
    console.log(result['statusCode']);
    //打印requestId
    console.log(result['headers']['x-nos-request-id'])
}

try {
    nosclient.delete_object(map, cb);
}
    catch(err) {
    console.log("Failed with code:" + err.code);
}

返回結果處理

  • api接口的第二個參數回調函數cb,cb中的操作由用戶自行定義,在收到響應的時候由sdk自動調用,並傳入一個result參數,該參數是調用api接口返回的結果對象,所有的返回參數都在這個result對象中。
  • 用戶可以在自定義cb的時候利用該參數獲取響應的內容,如uploadid,etag等等

例如:

var map = {
    bucket: 'bucketName' //桶名
};
var cb = function(result) {
    //獲取對象列表
    var objectlist = result['bucketInfo']['objectlist'];
    //遍曆對象列表
    for (var i = 0; i < objectlist.length; i++) {
        //打印對象信息
        console.log(objectlist[i]['key']);
        console.log(objectlist[i]['lastmodified']);
        console.log(objectlist[i]['etag']);
        console.log(objectlist[i]['size']);
    }
}

nosclient.list_objects(map, cb);

文件上傳

在NOS中用戶的基本操作單元是對象,亦可以理解為文件,NOS Node SDK提供了豐富的上傳接口,可以通過以下的方式上傳文件:

  • 流式上傳
  • 單塊上傳
  • 分塊上傳

流式上傳、單塊上傳最大為100M;分塊上傳除最後一塊外,分塊不能小於16k,每一個分塊不能大於100M,最多能上傳10000個分塊,即分塊上傳的文件最大支持1T。

流式上傳

你可以使用NosClient.put_object_stream上傳一個Stream中的內容,具體實現如下:

var readStream = fs.createReadStream('filepath');
    var size = fs.statSync('filepath').size;
var map = {
    bucket: 'bucketName', //桶名
    key: 'objectName', //對象名
    body: readStream, //上傳的流
    length: size //流的長度
};
var cb = function(result) {
    console.log(result);
};

try {
    nosclient.put_object_stream(map, cb);
}
    catch(err) {
    console.log("Failed with code:" + err.code);
}

回調函數的參數result中包含的內容示例:

statusCode: 200
headers:{
 'x-nos-request-id': '2aa8555c0af100000155fb83034c15fb',
 etag: 'b1335fbca4c89d12719cf99fdcab707e',
 'x-nos-object-name': 'objectName',
 'content-length': '0',
 connection: 'close',
 server: 'Jetty(6.1.11)' }

注:

  • 上傳的流內容不超過100M

單塊上傳

你可以使用NosClient.put_file上傳文件內容,具體實現如下:

var map = {
    bucket: 'bucketName', //桶名
    key: 'objectName', //對象名
    filepath: 'path' //文件路徑
};
var cb = function(result) {
    console.log(result);
};

try {
    nosclient.put_file(map, cb);
}
    catch(err) {
    console.log("Failed with code:" + err.code);
}

回調函數的參數result中包含的內容示例:

statusCode: 200
headers:{
 'x-nos-request-id': '2aa8555c0af100000155fb83034c15fb',
 etag: 'b1335fbca4c89d12719cf99fdcab707e',
 'x-nos-object-name': 'objectName',
 'content-length': '0',
 connection: 'close',
 erver: 'Jetty(6.1.11)' }

注:

  • 上傳的文件內容不超過100M

分塊上傳

除了通過put_file接口上傳文件到NOS之外,NOS還提供了另外一種上傳模式-分塊上傳,用戶可以在如下應用場景內(但不限於此),使用分塊上傳模式,如:

  • 需支持斷點上傳
  • 上傳超過100M的文件
  • 網絡條件較差,經常和NOS服務器斷開連接
  • 上傳文件之前無法確定文件的大小

分塊上傳本地文件

你可以使用NosClient.put_big_file來上傳一個大文件,具體實現如下:

var map = {
    bucket: 'bucketName', //桶名
    key: 'bigFileName', //對象名
    filepath: 'path' //文件路徑
};
var cb = function(result) {
    console.log(result);
};

try {
    nosclient.put_big_file(map, cb);
}
    catch(err) {
    console.log("Failed with code:" + err.code);
}

回調函數的參數result中包含的內容實例:

statusCode: 200
headers:{
 'x-nos-request-id': 'af253f210af100000155fb97d3ad15fb',
 etag: 'ff9360dc18c5e09a80db8f0aa115d52c',
 'content-length': '0',
 connection: 'close',
 server: 'Jetty(6.1.11)' }
multipart_upload_result:{
 location:bucketName.nos.netease.com/bigFileName,
 bucket:bucketName,
 key:bigFileName,
 etag:"3858f62230ac3c915f300c664312c11f-9"
}

原始接口分塊上傳

你可以使用原始的分塊上傳接口進行分塊上傳,一般流程如下所示:

  • 初始化一個分塊上傳任務
  • 上傳分塊
  • 完成分塊上傳或者取消分塊上傳

初始化分塊上傳

你可以使用NosClient.create_multipart_upload初始化分塊上傳,具體實現如下:

var map = {
    bucket: 'bucketName', //桶名
    key: 'objectName' //對象名
};
var cb = function(result) {
    var upload_id = result.multipart_upload_info.upload_id;
};

try {
    nosclient.create_multipart_upload(map, cb)
}
    catch(err) {
    console.log("Failed with code:" + err.code);
}

回調函數的參數result中包含的內容示例:

statusCode: 200,
headers: {
 server: 'openresty/1.9.15.1',
 date: 'Fri, 30 Sep 2016 02:59:40 GMT',
 'content-type': 'application/xml;charset=UTF-8',
 'content-length': '206',
 connection: 'close',
 'x-nos-request-id': 'a5659e760ab000000157790878a33f0c' },
multipart_upload_info: {
 bucket: 'bucketName',
 key: 'objectName',
 upload_id: '4752043808200245495'
}

上傳分塊

你可以使用NosClient.upload_part上傳文件內容,分塊不能小於16k,每一個分塊不能大於100M。具體實現如下:

var map = {
    bucket: 'bucketName', //桶名
    key: 'objectName', //對象名
    part_num: 1, //分塊數量
    upload_id: '4752043808200245495', //分塊上傳標識號(調用初始化分塊上傳接口create_multipart_upload得到)
    body: readStream,//每個分塊的內容
    length: 1415 //每個分塊的大小
}
var cb = function(result) {
    partNum = result.partNumber;
    etag = result.headers.etag;
};

try {
    nosclient.upload_part(map, cb);
}
    catch(err) {
    console.log("Failed with code:" + err.code);
}

回調函數的參數result中包含的內容示例:

statusCode: 200,
partNumber: 1,
headers: {
 server: 'openresty/1.9.15.1',
 date: 'Fri, 30 Sep 2016 02:59:40 GMT',
 'content-type': 'application/octet-stream',
 'content-length': '0',
 connection: 'close',
 'x-nos-request-id': '4ad419590ab000000157790878a30e11',
 etag: 'b3fecdb324e0ba4f1f89f7bfbeae7635'
}

完成分塊上傳

你可以使用NosClient.complete_multipart_upload完成分塊上傳,最多能上傳10000個分塊,即分塊上傳的文件最大支持1T。具體實現如下:

var map = {
    bucket: 'bucketName', //桶名
    key: 'objectName', //對象名
    upload_id: '4752043808200245495', //分塊上傳標識號(調用初始化分塊上傳接口create_multipart_upload得到得到)
    info: [{ //調用分塊上傳接口upload_part得到每個分塊的PartNumber和ETag
        PartNumber: '1',
        ETag: 'b3fecdb324e0ba4f1f89f7bfbeae7635'
    }]
}
var cb = function(result) {
    console.log(result);
};

try {
    nosclient.complete_multipart_upload(map, cb);
}
    catch(err) {
    console.log("Failed with code:" + err.code);
}

回調函數的參數result中包含的內容示例:

statusCode: 200,
headers: {
 server: 'openresty/1.9.15.1',
 date: 'Fri, 30 Sep 2016 02:59:40 GMT',
 'content-type': 'application/xml;charset=UTF-8',
 'content-length': '284',
 connection: 'close',
 'x-nos-request-id': 'c9ee554f0ab000000157790878a30e12' },
multipart_upload_result: {
 bucket: 'sdktest-private',
 etag: '5eb6b0a8c51e865c716306fdaf8cd1bc',
 key: 'objectName',
 location: 'bucketName.nos.netease.com/objectName'
}

分塊上傳實例

下麵通過一個完整的示例說明了如何通過原始的api接口一步一步的進行分塊上傳操作(以每個分塊100M為例),如果用戶需要做斷點續傳等高級操作,可以參考下麵代碼:

var filepath = map.filepath;
var fileStat = fs.statSync(filepath);
var total_length = fileStat.size;
var nosclient = this;
var _100M = 100 * 1024 * 1024;
var start = 0;
var end = _100M - 1;
var complete_info = [];
var fad_count = 0;
var count = 0;
var upload_id = null;
var Q = require('q');
var defer = Q.defer();
var partnum = (total_length % _100M == 0) ? (total_length / _100M) : Math.floor(total_length / _100M) + 1;

nosclient.create_multipart_upload(map,
function(result) {
    upload_id = result.multipart_upload_info.upload_id;
    var send10Parts = function() {
        for (var i = 0; i < 10; i++) {
            if (start >= total_length) {
                break;
            }
            if (end >= total_length) {
                end = total_length - 1;
            }
            var readStream = fs.createReadStream(filepath, {
                start: start,
                end: end
            });
            nosclient.upload_part({
                bucket: map.bucket,
                key: map.key,
                part_num: ++fad_count,
                upload_id: upload_id,
                body: readStream,
                length: end - start + 1
            },
            function(result) {
                complete_info[result.partNumber - 1] = {
                    PartNumber: result.partNumber,
                    ETag: result.headers.etag
                };
                count++;

                if (count % 10 == 0) {
                    if (start < total_length) {
                        defer.promise.then(function(fulfilled) {
                            send10Parts();
                        }) defer.resolve();
                    }
                }

                if (count == partnum) {
                    nosclient.complete_multipart_upload({
                        bucket: map.bucket,
                        key: map.key,
                        expires: map.expires,
                        disposition: map.disposition,
                        contentType: map.contentType,
                        encoding: map.encoding,
                        cacheControl: map.cacheControl,
                        language: map.language,
                        contentMD5: map.contentMD5,
                        upload_id: upload_id,
                        object_md5: map.object_md5,
                        info: complete_info
                    },
                    func);
                }
            });
            start = end + 1;
            end = end + _100M;
        }
    }
    defer.promise.then(function(fulfilled) {
        send10Parts();
    });
    defer.resolve();
})

注:

  • 上麵程序一共分為三個步驟:1. initiate 2. uploadPart 3. complete
  • Part號碼的範圍是1~10000。如果超出這個範圍,NOS將返回InvalidArgument的錯誤碼。
  • 初始化上傳之後,獲取upload_id。
  • 每次上傳分塊時都要把流定位到此次上傳塊開頭所對應的位置。
  • 每次上傳分塊之後,NOS的返回結果會包含一個complete_info對象,它是上傳塊的ETag與塊編號(PartNumber)的組合。在後續完成分片上傳的步驟中會用到它,因此我們需要將其保存起來,然後在第三步complete的時候使用,具體操作參考上麵代碼。
  • 這個示例為了防止過多的並發,使用promise進行了限製,每次最多隻有10個並發上傳,這樣可以防止在網絡環境不好的狀況下並發連接太多,上傳失敗。

取消正在上傳的分塊

分塊上傳任務初始化或上傳部分分塊後,可以使用NosClient.abort_multipart_upload接口中止分塊上傳事件。當分塊上傳事件被中止後,就不能再使用這個upload_id做任何操作,已經上傳的分塊數據也會被刪除,可以參考以下代碼:

var map = {
    bucket: 'bucketName', //桶名
    key: 'objectName', //對象名
    upload_id: '4688949732940019989' //分塊上傳標識號
}
var cb = function(result) {
    console.log(result);
};

try {
    nosclient.abort_multipart_upload(map, cb);
}
    catch(err) {
    console.log("Failed with code:" + err.code);
}

回調函數的參數result中包含的內容示例:

statusCode: 200
headers: {
 'x-nos-request-id': 'f381b02c0af100000155fba0d89e15fb',
 'content-length': '0',
 connection: 'close',
 server: 'Jetty(6.1.11)' }

查看已經上傳的分塊

查看已經上傳的分塊可以羅列出指定upload_id(create_multipart_upload時獲取)所屬的所有已經上傳成功的分塊,你可以通過NosClient.list_parts接口獲取已經上傳的分塊,可以參考以下代碼:

var map = {
    bucket: 'bucketName', //桶名
    key: 'objectName', //對象名
    upload_id: '4688949732940019989' //分塊上傳標識號
}
var cb = function(result) {
    console.log(result);
};

try {
    nosclient.list_parts(map, cb);
}
    catch(err) {
    console.log("Failed with code:" + err.code);
}

上述代碼中使用的map可選參數如下:

參數 描述
limit 響應中的limit個數. 類型:整型
part_number_marker 分塊號的界限,隻有更大的分塊號會被列出來。 類型:字符串

回調函數的參數result中包含的內容示例:

statusCode: 200
headers: {
 'x-nos-request-id': '5292fe910af100000155fba5740515fb',
 'content-type': 'application/xml; charset=UTF-8',
 'content-length': '1123',
 connection: 'close',
 server: 'Jetty(6.1.11)' }
list_parts_info:{
 bucket:'bucketName',
 key:'objectName',
 upload_id:'4685815523730016248',
 owner:{productid:'productid'},
 storageclass:'archive-standard',
 part_number_marker:'0',
 next_part_number_marker:'4',
 max_parts:'1000',
 is_truncated:'false',
 part_list:[{part_number:1,last_modified:2016-07-15T19:20:27 +0800,etag:b33df4c9833e4dcba58e72ea0a9fcd7f,size:12}......]
 //part_list是parts的數組,數據每個元素是一個map,包含part_number,last_modified,etag,size信息
}

查看當前正在進行的分塊上傳任務

查看正在進行的分塊上傳任務可以羅列出正在進行,還未完成的分塊上傳任務,你可以通過NosClient.list_multipart_upload接口當前的上傳任務,可以參考以下代碼:

var map = {
    bucket: 'bucketName' //桶名
}
var cb = function(result) {
    console.log(result);
};

try {
    nosclient.list_multipart_upload(map, cb);
}
    catch(err) {
    console.log("Failed with code:" + err.code);
}

上述代碼中使用的map參數如下:

參數值 描述
key_marker 指定某一key_marker,隻有大於該key_marker的才會被列出。類型:字符串
limit 最多返回limit條記錄,默認1000。類型:整型

回調函數的參數result中包含的內容示例:

statusCode: 200
headers: { 'x-nos-request-id': '6213b3d00af100000155fbabcf8115fb',
 'content-type': 'application/xml; charset=UTF-8',
 'content-length': '455',
 connection: 'close',
 server: 'Jetty(6.1.11)' }
multipart_upload_result:{
 bucket:'bucketName',
 next_key_marker:'4685815523730016248',
 is_truncated:'false',
 uploads:[{key:'objectName',upload_id:'4685815523730016248',storage_class:'archive-standard',owner:{name:'name',productid:'productid'},
        initiated:'2016-07-15T19:19:12 +0800'}......]
 //展示每個上傳信息的數組,數組的每個元素都是一個map,包含key,upload_id,storage_class,owner,initiated信息
}

設置文件元信息

文件元數據(object meta),是上傳到NOS的文件屬性描述信息:分為http標準屬性和用戶自定義元數據。文件元信息可以在各種上傳方式(流式上傳、單塊上傳、分塊上傳)進行設置,元數據大小寫不敏感。

設定http header

NOS允許用戶自定義http Header。http header相關信息請參考 RFC2616,幾個常用的header說明如下:

參數 說明
meta_data 用戶自定義的元數據,通過鍵值對的形式上報,鍵名和值均為字符串,且鍵名需以x-nos-meta-開頭。er字符之間的object作為一組元素
disposition 指示MINME用戶代理如何顯示附加的文件,打開或下載,及文件名稱
contentType 文件的MIME,定義文件的類型及網頁編碼,決定瀏覽器將以什麼形式、什麼編碼讀取文件。如果用戶沒有指定則根據Key或文件名的擴展名生成,如果沒有擴展名則填默認值
encoding 文件的編碼
cacheControl 指定該Object被下載時的網頁的緩存行為
language 文件的語言
contentMD5 文件的MD5
object_md5 僅對上傳大對象文件時有效,與complete_multipart_upload接口中的object_md5含義相同

下麵的源代碼實現了上傳文件時設置Http header:

var meta_data = {
    'x-nos-meta-my-meta': 'user define meta info'
}
var map = {
    bucket: 'bucketName', //桶名
    key: 'objectName', //對象名
    filepath: 'path', //文件路徑
    contentType: "image/jpeg", //文件的MIME類型
    meta_data: meta_data //用戶自定義元數據
};
var cb = function(result) {
    console.log(result);
};

try {
    nosclient.put_file(map, cb);
}
    catch(err) {
    console.log("Failed with code:" + err.code);
}

回調函數的參數result中包含的內容示例:

statusCode: 200,
headers: {
 server: 'openresty/1.9.15.1',
 date: 'Thu, 29 Sep 2016 06:00:01 GMT',
 'content-type': 'image/jpeg',
 'content-length': '0',
 connection: 'close',
 'x-nos-request-id': '3a17fd700ab00000015774873a023f0c',
 etag: 'dc28229fb48cc93025ce862e79c4623f',
 'x-nos-object-name': 'objectName' }

注:

  • 各種上傳方式(包括流式上傳、單塊上傳、分塊上傳)都可以設置元數據信息,設置的方式相同。
  • 通過設置文件的contentType,可以修改文件的類型。
  • 通過設置文件的disposition,可以控製文件的下載行為。

文件下載

NOS Node SDK提供了豐富的文件下載接口,用戶可以通過以下方式從NOS獲取文件:

  • 下載文件到內存
  • 下載到本地文件
  • 指定範圍下載
  • 條件下載

下載文件到內存

你可以通過NosClient.get_object_stream接口下載文件到內存,可以參考以下代碼:

ivar map = {
        bucket: 'bucketName', //桶名
        key: 'objectName' //對象名
};
var cb = function(result) {
        //打印statusCode
        console.log(result['statusCode']);
        //打印content-length
        console.log(result['headers']['content-length']);
        //獲取流
        var stream = result['stream'];
        //處理流
        ......
}

try {
        nosclient.get_object_stream(map, cb);
}
catch(err) {
        console.log("Failed with code:" + err.code);
}

回調函數的參數result中包含的內容示例:

statusCode: 200
headers: {
 'x-nos-request-id': 'aa2402d20af100000155fb6d6cd915fb',
 'content-type': 'application/octet-stream; charset=UTF-8',
 etag: '926d74ef88054b6586a5530c5c6606b3',
 'content-disposition': 'inline; filename="objectName"',
 'last-modified': 'Mon, 18 Jul 2016 08:33:12 Asia/Shanghai',
 'cache-control': 'no-cache',
 'content-length': '18',
 connection: 'close',
 server: 'Jetty(6.1.11)' }

下載文件到本地文件

你可以通過NosClient.get_object_file接口下載文件到本地文件,可以參考以下代碼:

var map = {
    bucket: 'bucketName', //桶名
    key: 'objectName', //對象名
    path: 'destpath' //本地文件路徑(包括文件名)
};
var cb = function(result) {
    console.log(result);
}

try {
    nosclient.get_object_file(map, cb);
}
    catch(err) {
    console.log("Failed with code:" + err.code);
}

回調函數的參數result中包含的內容示例:

statusCode: 200
headers: {
 'x-nos-request-id': 'aa2402d20af100000155fb6d6cd915fb',
 'content-type': 'application/octet-stream; charset=UTF-8',
 etag: '926d74ef88054b6586a5530c5c6606b3',
 'content-disposition': 'inline; filename="objectName"',
 'last-modified': 'Mon, 18 Jul 2016 08:33:12 Asia/Shanghai',
 'cache-control': 'no-cache',
 'content-length': '18',
 connection: 'close',
 server: 'Jetty(6.1.11)' }

指定範圍下載

如果存儲在NOS中的文件較大,並且你隻需要其中的一部分內容,你可以使用範圍下載,下載指定範圍的數據,如果指定的下載範圍為”0-100”,則返回結果為第0字節到第100字節的數據,返回的數據包含第100字節,即bytes=0-100,如果指定的範圍無效則下載整個文件,以下源代碼獲取bytes=0-100字節的內容,可以參考以下代碼:

var map = {
    bucket: 'bucketName', //桶名
    key: 'objectName', //對象名
    path: 'destpath', //本地文件路徑(包括文件名)
    rang: 'bytes=0-100' //文件範圍
};
var cb = function(result) {
    console.log(result);
}

try {
    nosclient.get_object_file(map, cb);
}
    catch(err) {
    console.log(""Failed with code: " + err.code");

回調函數的參數result中包含的內容示例:

statusCode: 200
headers: {
 'x-nos-request-id': 'aa2402d20af100000155fb6d6cd915fb',
 'content-type': 'application/octet-stream; charset=UTF-8',
 etag: '926d74ef88054b6586a5530c5c6606b3',
 'content-disposition': 'inline; filename="objectName"',
 'last-modified': 'Mon, 18 Jul 2016 08:33:12 Asia/Shanghai',
 'cache-control': 'no-cache',
 'content-length': '180',
 connection: 'close',
 server: 'Jetty(6.1.11)' }

注:

  • 下載內容也可以存儲到文件中
  • 注意下載的區間為閉區間

條件下載

下載文件時,可以指定限定條件,滿足限定條件時下載,不滿足時報錯,不下載文件。可以使用的限定條件如下:

參數 說明
if_modified_since 如果指定的時間早於實際修改時間,則正常傳送。否則返回錯誤
var map = {
    bucket: 'bucketName', //桶名
    key: 'objectName', //對象名
    path: 'destpath', //本地文件路徑(包括文件名)
    if_modified_since: 'Fri, 13 Nov 2016 14:47:53 GMT' //指定時間
};
var cb = function(result) {
    console.log(result);
}

try {
    nosclient.get_object_file(map, cb);
}
    catch(err) {
    console.log(""Failed with code: " + err.code");
}

回調函數的參數result中包含的內容示例:

statusCode: 200
headers: {
 'x-nos-request-id': 'aa2402d20af100000155fb6d6cd915fb',
 'content-type': 'application/octet-stream; charset=UTF-8',
 etag: '926d74ef88054b6586a5530c5c6606b3',
 'content-disposition': 'inline; filename="objectName"',
 'last-modified': 'Mon, 18 Jul 2016 08:33:12 Asia/Shanghai',
 'cache-control': 'no-cache',
 'content-length': '18',
 connection: 'close',
 server: 'Jetty(6.1.11)' }

注:

  • 下載內容也可以存儲到文件中

文件管理

在NOS中,用戶可以通過一係列的接口管理桶(Bucket)中的文件(Object),比如列舉桶內文件、刪除文件、拷貝文件等。

列出桶中的文件

你可以使用NosClient.list_objects列出存儲在桶中的文件:

var map = {
    bucket: 'bucketName' //桶名
};
var cb = function(result) {
    //獲取對象列表
    var objectlist = result['bucketInfo']['objectlist'];
    //遍曆對象列表
    for (var i = 0; i < objectlist.length; i++) {
        //打印對象信息
        console.log(objectlist[i]['key']);
        console.log(objectlist[i]['lastmodified']);
        console.log(objectlist[i]['etag']);
        console.log(objectlist[i]['size']);
    }
}

try {
    nosclient.list_objects(map, cb);
}
    catch(err) {
    console.log("Failed with code:" + err.code);
}

上述代碼中的map中的參數如下所示:

參數 說明
delimiter 用於對Object名字進行分組的字符。所有名字包含指定的前綴且第一次出現delimiter字符之間的object作為一組元素
prefix 限定返回的Key必須以prefix作為前綴。注意使用prefix查詢時,返回的Key中仍會包含prefix
limit 限定此次返回object的最大數,如果不設定,默認為100
marker 設定結果從marker之後按字母排序的第一個開始返回

回調函數的參數result中包含的內容示例:

statusCode: 200
headers: {
 'x-nos-request-id': 'db9524a10af100000155fb7ab73d15fb',
 'content-type': 'application/xml; charset=UTF-8',
 'content-length': '1343',
 connection: 'close',
 server: 'Jetty(6.1.11)' }
bucketInfo:{
 name:'bucket',
 prefix:'',
 marker:'',
 maxkeys:100,
 is_truncated:false,
 objectList:[{
 //object-list是一個數組,每個數據元素都是一個map,包含key,lastmodify,etag,size,storageclass 5項信息,代表桶裏麵的對象
  key:'a.txt',
  lastmodified:'2016-07-18T08:49:03 +0800',
  etag:'926d74ef88054b6586a5530c5c6606b3',
  size:18,storageclass:archive-standard},......]
}

注:

  • 上述表中的參數都是可選參數

刪除單個文件

你可以使用NosClient.delete_object刪除單個需要刪除的文件:

var map = {
    bucket:'bucketName', //桶名
    key:'objectName' //對象名
};
var cb = function(result) {
    //打印statusCode
    console.log(result['statusCode']);
    //打印requestId
    console.log(result['headers']['x-nos-request-id'])
}

try {
    nosclient.delete_object(map, cb);
}
    catch(err) {
    console.log("Failed with code:" + err.code);
}

回調函數的參數result中包含的內容示例:

statusCode: 200
headers: {
 'x-nos-request-id': 'e2f97ce70af100000155fb63f9fc15fb',
 'x-nos-version-id': '0',
 'content-length': '0',
 connection: 'close',
 server: 'Jetty(6.1.11)' }

刪除多個文件

你可以使用NosClient.delete_objects刪除多個需要刪除的文件:

var map = {
    bucket: 'bucketName', //桶名
    keys: [{Key: 'objectName1'},{Key: 'objectName2'},{Key: 'objectName3'},{Key: 'objectName4'}] //需要刪除的對象名
};
var cb = function(result) {
    //打印statusCode
    console.log(result['statusCode']);
    //打印requestId
    console.log(result['headers']['x-nos-request-id'])
    //打印所有刪除成功的對象名
    var deleteSuccess = result['deleteSuccess']
    for (var i = 0; i < deleteSuccess.length; i++) {
        console.log(deleteSuccess[i])
    }
    //打印所有刪除失敗的對象名
    var deleteFail = result['deleteFail']
    for (var i = 0; i < deleteFail; i++) {
        console.log(deleteFail[i]['Key']);
        console.log(deleteFail[i]['Message']);
    }
}

try {
    nosclient.delete_objects(map, cb);
}
    catch(err) {
    console.log("Failed with code:" + err.code);
}

回調函數的參數result中包含的內容示例:

statusCode: 200
headers: {
 'x-nos-request-id': 'ab6f6cce0af100000155fb68571115fb',
 'content-type': 'application/xml; charset=UTF-8',
 'content-length': '55',
 connection: 'close',
 server: 'Jetty(6.1.11)' }
 delete-success:['objectName1','objectName3']
 delete-fail:[{Key:'objectName2',Message:'NoSuchBucket'},{Key:'objectName4',Message:'AccessDenied'}]

拷貝文件

你可以使用NosClient.copy_object拷貝文件:

var map = {
    src_bucket:'srcBucketName', //源桶名
    src_key:'srcObjectName', //源對象名
    dest_bucket:'destBucketName', //目標桶名
    dest_key:'destObjectName' //目標對象名
};
var cb = function(result){
    console.log(result);
}

try{
    nosclient.copy_object(map,cb);
}
catch(err){
    console.log("Failed with code:" + err.code);
}

回調函數的參數result中包含的內容示例:

statusCode: 200
headers: {
'x-nos-request-id': 'aa1c14690af100000155fb8d577415fb',
'content-length': '0',
connection: 'close',
server: 'Jetty(6.1.11)' }

注:

  • 支持跨桶的文件copy

移動文件

你可以使用NosClient.move_object移動文件:

var map = {
    src_bucket: 'srcBucketName', //源桶名
    src_key: 'srcObjectName', //源對象名
    dest_bucket: 'destBucketName', //目標桶名
    dest_key: 'destObjectName' //目標對象名
};
var cb = function(result) {
    console.log(result);
}

try {
    nosclient.move_object(map, cb);
}
    catch(err) {
    console.log("Failed with code:" + err.code);
}

回調函數的參數result中包含的內容示例:

statusCode: 200
headers: {
 'x-nos-request-id': 'aa1c14690af100000155fb8d577415fb',
 'content-length': '0',
 connection: 'close',
 server: 'Jetty(6.1.11)' }

注:

  • 暫時不支持跨桶的文件move

修改文件元信息

暫時不提供此類方法

獲取文件的文件元信息

你可以使用NosClient.head_object獲取文件元信息:

var map = {
    bucket: 'bucketName', //桶名
    key: 'objectName' //對象名
};
var cb = function(result) {
    console.log(result);
}

try {
    nosclient.head_object(map, cb);
}
    catch(err) {
    console.log("Failed with code:" + err.code);
}

回調函數的參數result中包含的內容示例:

statusCode: 200
headers: {
 'x-nos-request-id': '346251790af100000155fb76baac15fb',
 etag: '926d74ef88054b6586a5530c5c6606b3',
 'content-length': '18',
 'last-modified': 'Mon, 18 Jul 2016 08:33:12 Asia/Shanghai',
 'content-type': 'application/octet-stream',
 'cache-control': 'no-cache',
 connection: 'close',
 server: 'Jetty(6.1.11)' }

錯誤處理

異常處理

調用NosClient類的相關接口時,如果拋出異常,則表明操作失敗,否則操作成功。拋出異常時,方法返回的數據無效。

異常處理實例

錯誤處理代碼如下所示:

try {
    nosclient.delete_objects({
        bucket: 'bucketName',
        keys: [{Key: 'objectName1'},{Key: 'objectName2'}]
    },
    func);
}
    catch(err) {
    console.log("Failed with code:" + err.code);
    console.log("Failed with statusCode:" + err.statusCode + "\terrorCode:" + err.errorCode + "\tmessage:" + err.message + "\trequestId:" + err.requestId + "\tresource:" + err.resource);
}

異常包含的信息

異常包括兩類:

A.客戶端異常,包括參數無效、文件不存在等錯誤。該類錯誤可以通過err.code獲取錯誤信息。

B.服務器端異常,指NOS返回的錯誤,比如無權限、文件不存在等。該類異常包含以下信息:

  • 1.statusCode: HTTP狀態碼,通過方法err.statusCode獲取。
  • 2.errorCode: NOS返回給用戶的錯誤碼,通過方法err.errorCode獲取。
  • 3.message: NOS提供的錯誤描述,通過方法err.message獲取。
  • 4.requestId: 用於唯一標識該請求的UUID;當你無法解決問題時,可以憑這個來請求NOS開發工程師的幫助。通過方法err.requestId獲取。
  • 5.resource: NOS返回的包含了Bucket或Object的請求資源描述符。通過方法err.resource獲取。

最後更新:2017-01-03 10:48:52

  上一篇:go 對象存儲 .NET SDK
  下一篇:go 配額常見問題