閱讀814 返回首頁    go iPhone_iPad_Mac_apple


【OSS 最佳實踐】JS SDK使用STS方式實現斷點續傳

OSS提供JS SDK方式可以讓用戶直接在前端頁麵中嵌入js包直接操作OSS,但是該方式操作OSS最容易出現的問題即是AccessKeyId和AccessKeySecret的泄露導致被惡意訪問的情況。因此提供了STS的方式動態獲取token操作OSS,隨之而來帶來了整個業務邏輯的複雜度。今天在這裏給大家介紹STS方式進行斷點續傳的實踐方法。

基本概念

1. OSS Javascript SDK
OSS提供了海量、安全、低成本、高可靠的雲存儲服務,因此該產品最基本的功能即是實現將客戶端的資源上傳至OSS。OSS底層提供了與平台無關的RESTful API接口,但是該接口需要用戶自行實現拚接發到OSS服務器的請求包以及簽名參數,對於客戶的技術水平提出了較高的要求。
因此OSS提供了各種語言的SDK幫助用戶較方便的接入OSS並實現與OSS服務器端的對接操作,詳細的SDK列表請參考 OSS SDK 列表,其中絕大多數的SDK均是服務器端的SDK,是無法直接在前端頁麵中使用的。而Javascript SDK包括瀏覽器應用和node.js兩種方式,瀏覽器應用即可以實現前端頁麵直接操作OSS,避免增加應用服務器的負載壓力。

2. 斷點續傳功能
在OSS上傳資源的場景中經常會遇到以下場景導致上傳失敗等問題,對於用戶體驗較差:

  • 上傳超過100MB大小的文件;
  • 網絡條件較差,和OSS的服務器之間的鏈接經常斷開;
  • 上傳文件需要實時掌握上傳進度;
  • 業務邏輯需要斷點續傳。

因此OSS提供了斷點續傳的方法幫助用戶改善該場景。斷點續傳的方法主要是通過checkpoint和分塊上傳的接口實現的斷點續傳。
分塊上傳是SDK將用戶待上傳的完整文件分成若幹個分片後分別上傳,然後上傳完成後驗證各個分塊的etag保證數據正確性後進行合並完成的。因此分塊上傳的邏輯主要包括:
InitiateMultipartUpload(生成UploadId並設置Object的HTTP頭)->UploadPart(上傳分塊,可並行上傳)->CompleteMultipartUpload(根據part列表驗證每個part的有效性後合並為完整的Object)。
斷點續傳即是在progress參數中將斷點信息拋出記錄在checkpoint變量中。後續續傳時即將之前記錄的checkpoint信息重新傳入multipartUpload接口即可以實現,對應的demo請參考:

var co = require('co');
var OSS = require('ali-oss')
var client = new OSS({
  region: '<Your region>',
  accessKeyId: '<Your AccessKeyId>',
  accessKeySecret: '<Your AccessKeySecret>',
  bucket: 'Your bucket name'
});
co(function* () {
  var checkpoint;
  // retry 5 times
  for (var i = 0; i < 5; i++) {
      var result = yield client.multipartUpload('object-key', 'local-file', {
        checkpoint: checkpoint,
        progress: function* (percentage, cpt) {
          checkpoint = cpt;
        }
      });
      console.log(result);
      break; // break if success
    } catch (err) {
      console.log(err);
    }
  }
}).catch(function (err) {
  console.log(err);
});

Javascript sdk對於上述的三個部分做了封裝,因此對於用戶來講不需要分步操作,而僅需要統一調用multipartUpload接口即可實現。

3. STS的Token功能
OSS SDK操作OSS均是需要通過AccesssKeyId和AccessKeySecret

最後更新:2017-08-25 01:32:14

  上一篇:go  筆記:Six Pointers for Creating Strong Operational Business Values
  下一篇:go  在阿裏雲容器服務上,輕鬆搭建Concourse CI