全部產品
Search
文件中心

Object Storage Service:服務端簽名直傳

更新時間:Feb 28, 2024

服務端簽名直傳是指在服務端產生簽名,將簽名返回給用戶端,然後用戶端使用簽名上傳檔案到OSS。由於服務端簽名直傳無需將存取金鑰暴露在前端頁面,相比用戶端簽名直傳具有更高的安全性。本文介紹如何進行服務端簽名直傳。

請求流程

服務端簽名直傳流程如下圖所示。

操作樣本

服務端簽名直傳並設定上傳回調提供了以下語言的操作樣本:

代碼解析

服務端簽名直傳的詳細流程如下。

  1. 使用者嚮應用伺服器請求上傳Policy。

    用戶端源碼中的upload.js檔案的以下程式碼片段的變數serverUrl的值設定為應用伺服器的URL。

    // serverUrl是使用者擷取簽名和Policy等資訊的應用伺服器的URL,請將下面的IP和Port配置為您自己的真實資訊。
    serverUrl = 'http://88.88.XX.XX:8888';
    

    設定完成後,用戶端會向該serverUrl發送Get請求來擷取需要的資訊。

    本情境為服務端簽名後直傳,不涉及上傳回調(callback)。您需要將用戶端源碼中的upload.js內的'callback' : callbackbody欄位注釋掉,以關閉上傳回調功能。修改樣本如下:

    {
      'key' : key + '${filename}',
      'policy': policyBase64,
      'OSSAccessKeyId': accessid,
      // 設定服務端返回200狀態代碼,預設返回204。
      'success_action_status' : '200', 
      // 'callback' : callbackbody,  
      'signature': signature,
    }
  2. 應用伺服器返回上傳Policy和簽名給使用者。

    應用伺服器側的簽名直傳服務會處理用戶端發送的Get請求訊息,您可以設定對應的代碼讓應用伺服器能夠給用戶端返回正確的訊息。

    以下是簽名直傳服務返回給用戶端訊息Body內容的樣本:

    {
      "accessid":"LTAI5tBDFVar1hoq****",
      "host":"https://post-test.oss-cn-hangzhou.aliyuncs.com",
      "policy":"eyJleHBpcmF0aW9uIjoiMjAxNS0xMS0wNVQyMDoyMzoyM1oiLCJjxb25kaXRpb25zIjpbWyJjcb250ZW50LWxlbmd0aC1yYW5nZSIsMCwxMDQ4NTc2MDAwXSxbInN0YXJ0cy13aXRoIiwiJGtleSIsInVzZXItZGlyXC8i****",
      "signature":"VsxOcOudx******z93CLaXPz+4s=",
      "expire":1446727949,
      "dir":"user-dirs/"
    }

    Body中的各欄位說明如下:

    欄位

    描述

    accessid

    使用者請求的AccessKey ID。

    host

    使用者發送上傳請求的網域名稱。

    說明

    host不支援自訂網域名。

    policy

    使用者表單上傳的策略(Policy),Policy為經過Base64編碼過的字串。詳情請參見Post Policy

    signature

    對Policy簽名後的字串。詳情請參見Post Signature

    expire

    由伺服器端指定的Policy到期時間,格式為Unix時間戳記(自UTC時間1970年01月01號開始的秒數)。

    dir

    限制上傳的檔案首碼。

  3. 使用者使用POST方法向OSS傳送檔案上傳請求。

    說明
    • 除file表單域外,包含key在內的其他所有表單域的大小均不能超過8 KB。

    • 用戶端上傳預設同名覆蓋,如果您不希望覆蓋同名檔案,可以在上傳請求的header中攜帶參數x-oss-forbid-overwrite,並指定其值為true。當您上傳的檔案在OSS中存在同名檔案時,該檔案會上傳失敗,並返回FileAlreadyExists錯誤。

    new_multipart_params = {
         // key表示上傳到Bucket內的Object的完整路徑,例如exampledir/exampleobject.txtObject,完整路徑中不能包含Bucket名稱。
         // filename表示待上傳的本地檔案名稱。
         'key' : key + '${filename}',
         'policy': policyBase64,
         'OSSAccessKeyId': accessid,
         // 設定服務端返回狀態代碼為200,不設定則預設返回狀態代碼204。
         'success_action_status' : '200',
         'signature': signature,
     };
    

操作步驟

快速部署

您可以使用Resource Orchestration Service一鍵配置1個Elastic Compute Service執行個體和1個Object Storage Service Bucket,並在Elastic Compute Service執行個體上部署應用伺服器源碼用戶端源碼,從而快速體驗服務端簽名直傳。使用Resource Orchestration Service快速體驗服務端簽名直傳的操作步驟如下。

  1. 一鍵部署雲資源。

    1. 開啟一鍵配置模板連結

    2. 資源編排 ROS控制台,輸入資源棧名稱,輸入建立OSS Bucket的名稱,設定新購ECS的可用性區域、執行個體類型、系統硬碟類型、執行個體密碼,然後單擊創建

      資源棧的資源棧資訊頁簽下狀態顯示建立中

    3. 資源棧的狀態顯示建立成功後,單擊輸出頁簽,查看一鍵部署的Elastic Compute Service執行個體、OSS Bucket。

  2. 體驗服務端簽名直傳。

    1. 輸出頁簽下,複製OssClientAddress的值,然後在瀏覽器中開啟。

    2. OSS web直傳頁面,單擊選擇檔案,選擇指定類型的檔案,然後單擊開始上傳

  3. 體驗完成後,釋放測試資源,避免繼續產生費用。

    1. 資源棧頁面的右上方,單擊刪除

    2. 刪除資源棧頁面,確保刪除方式釋放資源,然後單擊確定

相關文檔

大多數情況下,應用伺服器需要瞭解使用者上傳了哪些檔案以及對應的檔案名稱等資訊。如果上傳的是圖片,還希望擷取圖片大小等。此時,您可以通過上傳回調方案實現該需求。關於服務端簽名直傳並設定上傳回調的介紹,請參見伺服器端簽名直傳並設定上傳回調