全部產品
Search
文件中心

Object Storage Service:Go

更新時間:Feb 28, 2024

本文以Go語言為例,講解在服務端通過Go程式碼完成簽名,並且設定上傳回調,然後通過表單直傳資料到OSS。

前提條件

  • 應用伺服器對應的網域名稱可通過公網訪問。
  • 應用伺服器已經安裝Go 1.6以上版本(執行命令go version進行驗證)。
  • PC端瀏覽器支援JavaScript。

步驟1:配置應用伺服器

  1. 下載應用伺服器源碼(Go版本)到應用伺服器的目錄下。
  2. 以Ubuntu 16.04為例,將源碼放置到/home/aliyun/aliyun-oss-appserver-go目錄下。
  3. 進入該目錄,開啟源碼檔案appserver.go,修改以下程式碼片段:
    // 請填寫您的AccessKeyId。
    var accessKeyId string = "<yourAccessKeyId>"
    
    // 請填寫您的AccessKeySecret。
    var accessKeySecret string = "<yourAccessKeySecret>"
    
    // host的格式為bucketname.endpoint,請替換為您的真實資訊。
    var host string = "https://bucket-name.oss-cn-hangzhou.aliyuncs.com'"
    
    // callbackUrl為上傳回調伺服器的URL,請將下面的IP和Port配置為您自己的真實資訊。
    var callbackUrl string = "http://192.0.2.0:8888";
    
    // 上傳檔案時指定的首碼。
    var upload_dir string = "user-dir-prefix/"
    
    // 上傳策略Policy的失效時間,單位為秒。
    var expire_time int64 = 30
    • accessKeyId:設定您的AccessKeyId。
    • accessKeySecret:設定您的AessKeySecret。
    • host:格式為https://bucketname.endpoint,例如https://bucket-name.oss-cn-hangzhou.aliyuncs.com。關於Endpoint的介紹,請參見Endpoint訪問網域名稱
    • callbackUrl:設定上傳回調URL,即回調伺服器位址,用於處理應用伺服器與OSS之間的通訊。OSS會在檔案上傳完成後,把檔案上傳資訊通過此回調URL發送給應用伺服器。本例中修改為var callbackUrl string="http://192.0.2.0:1234";
    • dir:若要設定上傳到OSS檔案的首碼則需要配置此項,否則置空即可。

步驟2:配置用戶端

  1. 下載用戶端源碼到PC端的本地目錄。
  2. 將以檔案解壓,並開啟upload.js檔案,找到下面的代碼語句:
    // serverUrl是使用者擷取簽名和Policy等資訊的應用伺服器的URL,請將下面的IP和Port配置為您自己的真實資訊。
    serverUrl ='http://192.0.2.0:8888'
  3. severUrl修改為應用伺服器的地址。本樣本中修改為serverUrl ='http://192.0.2.0:1234'

步驟3: 修改CORS

用戶端進行表單直傳到OSS時,會從瀏覽器向OSS發送帶有Origin的請求訊息。OSS對帶有Origin頭的請求訊息會進行跨域規則(CORS)的驗證。因此需要為Bucket設定跨域規則以支援Post方法。

  1. 登入OSS管理主控台

  2. 單擊Bucket 列表,然後單擊目標Bucket名稱。

  3. 在左側導覽列,選擇資料安全 > 跨網域設定
  4. 單擊建立規則,配置如下圖所示。
    說明 為了您的資料安全,實際使用時,來源建議填寫實際允許訪問的網域名稱。更多配置資訊請參見設定跨域訪問

步驟4:體驗上傳回調

  1. 啟動應用伺服器。
    /home/aliyun/aliyun-oss-appserver-go目錄下,執行Go命令:go run appserver.go 192.0.2.0 1234
    說明 請將IP和連接埠改成您配置的應用伺服器的IP和連接埠。
  2. 啟動用戶端。
    1. 在PC端的用戶端源碼目錄中,開啟index.html檔案。
      重要 index.html檔案不保證相容IE 10以下版本瀏覽器,若使用IE 10以下版本瀏覽器出現問題時,您需要自行調試。
    2. 單擊選擇檔案,選擇指定類型的檔案之後,單擊開始上傳。上傳成功後,顯示回調伺服器返回的內容。

應用伺服器核心代碼解析

應用伺服器源碼包含了簽名直傳服務和上傳回調服務兩個功能。

  • 簽名直傳服務

    簽名直傳服務響應用戶端發送給應用伺服器的GET訊息,程式碼片段如下。

    func handlerRequest(w http.ResponseWriter, r *http.Request) {   
            if (r.Method == "GET") {
                    response := get_policy_token()
                    w.Header().Set("Access-Control-Allow-Methods", "POST")
                    w.Header().Set("Access-Control-Allow-Origin", "*")
                    io.WriteString(w, response)
            }
  • 上傳回調服務

    上傳回調服務響應OSS發送給應用伺服器的POST訊息,程式碼片段如下。

    if (r.Method == "POST") {
                    fmt.Println("\nHandle Post Request ... ")
    
                    // Get PublicKey bytes
                    bytePublicKey, err := getPublicKey(r)
                    if (err != nil) {
                            responseFailed(w)
                            return
                    }
    
                    // Get Authorization bytes : decode from Base64String
                    byteAuthorization, err := getAuthorization(r)
                    if (err != nil) {
                            responseFailed(w)
                            return
                    }
    
                    // Get MD5 bytes from Newly Constructed Authorization String. 
                    byteMD5, err := getMD5FromNewAuthString(r)
                    if (err != nil) {
                            responseFailed(w)
                            return
                    }
    
                    // verifySignature and response to client 
                    if (verifySignature(bytePublicKey, byteMD5, byteAuthorization)) {
                            // do something you want according to callback_body ...
    
                            responseSuccess(w)  // response OK : 200  
                    } else {
                            responseFailed(w)   // response FAILED : 400 
                    }
            }

    更多資訊,請參見API文檔Callback