全部產品
Search
文件中心

Object Storage Service:Callback

更新時間:May 20, 2025

OSS支援在檔案上傳後自動觸發回調,通知應用伺服器執行後續操作。

使用限制

  • 地區限制

    華東1(杭州)、華東2(上海)、華北1(青島)、華北2(北京)、華北 3(張家口)、華北5(呼和浩特)、華北6(烏蘭察布)、華南1(深圳)、華南2(河源)、華南3(廣州)、西南1(成都)、中國香港、美國(矽谷)、美國(維吉尼亞)、日本(東京)、新加坡、馬來西亞(吉隆坡)、印尼(雅加達)、菲律賓(馬尼拉)、德國(法蘭克福)、英國(倫敦)、阿聯酋(杜拜)地區支援設定Callback。

  • 回調行為說明

    • 回調請求必須在5秒內響應,逾時將視為失敗。

    • 回調失敗不影響檔案上傳成功。

    • 回調失敗不會自動重試。

  • 介面支援

    PutObjectPostObjectCompleteMultipartUpload介面支援設定 Callback。V2 SDK 基於以上基礎介面封裝的檔案上傳管理器、預簽名 URL 也支援設定 Callback。

回調流程概覽

OSS 回調具體步驟如下:

  1. 用戶端上傳檔案(附帶回調參數)

    上傳檔案時,用戶端需要攜帶 Callback 參數,指定回調伺服器的地址和回調內容。若需要傳遞自訂變數,還可以選擇附加callback-var參數。

  2. OSS 隱藏檔並發送回調請求

    檔案上傳成功後,OSS 以 POST 方式向回調 URL 發送請求,包含檔案資訊(如 bucket、object、size、ETag等)及自訂參數。

  3. 伺服器處理回調並返迴響應

    伺服器接收回調請求後,驗證請求籤名(可選)以確保安全,5 秒內完成處理並返回 JSON 響應。HTTP 狀態代碼 200 表示成功,非 200 視為回調失敗。

  4. OSS 返回上傳結果

    在回調響應成功後,OSS會根據應用伺服器的返回結果向用戶端提供最終處理結果。

開發實現指南

上傳回調的調試包含兩部分:用戶端上傳和服務端回調處理。建議先調試用戶端上傳部分,再調試應用伺服器部分,兩部分均調試完成後,再進行完整的聯調驗證。

用戶端實現

以下內容主要說明上傳回調參數的構造邏輯與處理流程。如需快速實現上傳回調功能,建議參考SDK提供的範例程式碼。

為了讓 OSS 在檔案上傳完成後自動觸發回調,您需要通過上傳請求傳入兩個參數:callback和(可選的)callback-var。

  1. 構造callback參數。

    該參數用於定義應用伺服器位址、請求內容格式等資訊,必須以 JSON 格式構造並進行 Base 64 編碼。

    1. 最簡配置樣本:

      {
      "callbackUrl":"http://oss-demo.aliyuncs.com:23450",
      "callbackBody":"bucket=${bucket}&object=${object}&my_var=${x:my_var}"
      }

      在該樣本中:

      • callbackUrl:應用伺服器位址,需根據實際地址修改。此處以http://oss-demo.aliyuncs.com:23450為例。

      • callbackBody:回調請求體的內容,支援使用系統變數 ${bucket}、${object}等,也可通過 ${x:xxx} 引用自訂變數。更多系統變數請參見callbackBody支援的系統參數

    2. 進階配置樣本:

      {
      "callbackUrl":"http://oss-demo.aliyuncs.com:23450",
      "callbackHost":"oss-cn-hangzhou.aliyuncs.com",
      "callbackBody":"bucket=${bucket}&object=${object}&my_var=${x:my_var}",
      "callbackBodyType":"application/x-www-form-urlencoded",
      "callbackSNI":false
      }

      詳細欄位說明請參見:callback參數詳情

  2. 構造callback-var參數(可選)

    該參數用於嚮應用伺服器傳遞自訂商務資訊,例如使用者識別碼、訂單號等。必須符合 JSON 格式,且每個自訂參數的 key 必須以 x: 開頭,並使用小寫字母。例如:

    {
      "x:uid": "12345",
      "x:order_id": "67890"
    }

    callback-var必須與 callbackBody 配合使用。對於上述樣本中的自訂參數使用者id(uid)和訂單號(order_id),在callbackBody中需要通過預留位置${x:xxx} 來引用。例如:

    {
      "callbackUrl": "http://oss-demo.aliyuncs.com:23450",
      "callbackBody": "uid=${x:uid}&order=${x:order_id}"
    }

    實際回調時,OSS會發送以下內容(假設callbackBodyType為 application/x-www-form-urlencoded):

    uid=12345&order=67890
  3. 在構造好callback 和callback-var參數後,您需要將它們進行Base64編碼。

    • 樣本:callback參數編碼

      原始callback參數

      {
          "callbackUrl": "http://oss-demo.aliyuncs.com:23450",
          "callbackHost": "your.callback.com",
          "callbackBody": "bucket=${bucket}&object=${object}&uid=${x:uid}&order=${x:order_id}",
          "callbackBodyType": "application/x-www-form-urlencoded",
          "callbackSNI": false
      }

      Base64編碼後的結果:

      eyJjYWxsYmFja0hvc3QiOiAieW91ci5jYWxsYmFjay5jb20iLCAiY2FsbGJhY2tVcmwiOiAiaHR0cDovL29zcy1kZW1vLmFsaXl1bmNzLmNvbToyMzQ1MCIsICJjYWxsYmFja0JvZHkiOiAiYnVja2V0PSR7YnVja2V0fSZvYmplY3Q9JHtvYmplY3R9JnVpZD0ke3g6dWlkfSZvcmRlcj0ke3g6b3JkZXJfaWR9IiwgImNhbGxiYWNrQm9keVR5cGUiOiAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiwgImNhbGxiYWNrU05JIjogZmFsc2V9
    • 樣本:callback-var參數編碼

      原始callback-var參數:

      {
        "x:uid": "12345",
        "x:order_id": "67890"
      }

      Base64編碼後的結果:

      eyJ4OnVpZCI6ICIxMjM0NSIsICJ4Om9yZGVyX2lkIjogIjY3ODkwIn0=
  4. 將編碼後的參數附加到請求中。

    完成編碼後,您可以通過以下方式將編碼後的參數傳遞給OSS。

    在Header中攜帶參數(推薦)

    適用於通過SDK或後端代碼上傳對象的情境,安全性高,推薦優先使用。您可通過設定HTTP頭部欄位x-oss-callback和x-oss-callback-var來傳遞迴調參數:

    • x-oss-callback:Base 64 編碼後的 callback 參數

    • x-oss-callback-var(可選):Base 64 編碼後的 callback-var 參數

    注意:計算請求籤名時,這兩個參數必須包含在Canonical Headers中,以確保請求合法。

    樣本:通過 Header 傳遞迴調參數

    PUT /your_object HTTP/1.1
    Host: callback-test.oss-test.aliyun-inc.com
    Accept-Encoding: identity
    Content-Length: 5
    x-oss-callback-var: eyJ4OnVpZCI6ICIxMjM0NSIsICJ4Om9yZGVyX2lkIjogIjY3ODkwIn0=
    User-Agent: aliyun-sdk-python/0.4.0 (Linux/2.6.32-220.23.2.ali1089.el5.x86_64/x86_64;2.5.4)
    x-oss-callback: eyJjYWxsYmFja0hvc3QiOiAieW91ci5jYWxsYmFjay5jb20iLCAiY2FsbGJhY2tVcmwiOiAiaHR0cDovL29zcy1kZW1vLmFsaXl1bmNzLmNvbToyMzQ1MCIsICJjYWxsYmFja0JvZHkiOiAiYnVja2V0PSR7YnVja2V0fSZvYmplY3Q9JHtvYmplY3R9JnVpZD0ke3g6dWlkfSZvcmRlcj0ke3g6b3JkZXJfaWR9IiwgImNhbGxiYWNrQm9keVR5cGUiOiAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiwgImNhbGxiYWNrU05JIjogZmFsc2V9
    Host: callback-test.oss-test.aliyun-inc.com
    Expect: 100-Continue
    Date: Wed, 26 Apr 2023 03:46:17 GMT
    Content-Type: text/plain
    Authorization: OSS qn6q**************:77Dv****************
    Test

    在POST請求的Body中使用表單域來攜帶參數

    僅適用於PostObject介面上傳,回調參數只能通過 POST 請求的 Body 中的表單域傳遞。

    • callback參數:需作為獨立表單項傳入,值為Base64編碼後的JSON配置。

      --9431149156168
      Content-Disposition: form-data; name="callback"
      eyJjYWxsYmFja0hvc3QiOiAieW91ci5jYWxsYmFjay5jb20iLCAiY2FsbGJhY2tVcmwiOiAiaHR0cDovL29zcy1kZW1vLmFsaXl1bmNzLmNvbToyMzQ1MCIsICJjYWxsYmFja0JvZHkiOiAiYnVja2V0PSR7YnVja2V0fSZvYmplY3Q9JHtvYmplY3R9JnVpZD0ke3g6dWlkfSZvcmRlcj0ke3g6b3JkZXJfaWR9IiwgImNhbGxiYWNrQm9keVR5cGUiOiAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiwgImNhbGxiYWNrU05JIjogZmFsc2V9
    • callback-var參數(自訂參數):每個自訂欄位必須作為獨立表單項傳入,不能封裝成一個整體的callback-var欄位。

      例如,對於自訂參數uid和order_id:

      {
        "x:uid": "12345",
        "x:order_id": "67890"
      }

      應轉換為表單中的兩個獨立欄位。

      --9431149156168
      Content-Disposition: form-data; name="x:uid"
      12345
      --9431149156168
      Content-Disposition: form-data; name="x:order_id"
      67890
    • 驗證callback參數(可選):您可以在 policy 中指定 callback 參數的校正條件。如果未設定,則上傳時不會校正該參數。例如:

      { "expiration": "2021-12-01T12:00:00.000Z",
        "conditions": [
          {"bucket": "examplebucket" },
          {"callback": "eyJjYWxsYmFja0hvc3QiOiAieW91ci5jYWxsYmFjay5jb20iLCAiY2FsbGJhY2tVcmwiOiAiaHR0cDovL29zcy1kZW1vLmFsaXl1bmNzLmNvbToyMzQ1MCIsICJjYWxsYmFja0JvZHkiOiAiYnVja2V0PSR7YnVja2V0fSZvYmplY3Q9JHtvYmplY3R9JnVpZD0ke3g6dWlkfSZvcmRlcj0ke3g6b3JkZXJfaWR9IiwgImNhbGxiYWNrQm9keVR5cGUiOiAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiwgImNhbGxiYWNrU05JIjogZmFsc2V9"},
          ["starts-with", "$key", "user/eric/"],
        ]
      }

    在URL中攜帶參數

    • 該方式常用於預簽名URL上傳檔案的情境,通過將回調參數 Base 64 編碼後拼接在 URL 中實現自動回調。但由於回調資訊暴露在 URL 中,存在一定的安全風險,僅建議用於臨時訪問或低敏感情境。

    • 如果您選擇通過 URL 攜帶回調參數,則必須包含callback參數,callback-var參數為可選。簽名計算時,這些參數需作為Canonical Query String的一部分參與計算。更多資訊,請參見簽名版本4

      樣本:

      PUT /your_object?OSSAccessKeyId=LTAI******************&Signature=vjby*************************************&Expires=1682484377&callback-var=eyJ4OnVpZCI6ICIxMjM0NSIsICJ4Om9yZGVyX2lkIjogIjY3ODkwIn0=&callback=eyJjYWxsYmFja0hvc3QiOiAieW91ci5jYWxsYmFjay5jb20iLCAiY2FsbGJhY2tVcmwiOiAiaHR0cDovL29zcy1kZW1vLmFsaXl1bmNzLmNvbToyMzQ1MCIsICJjYWxsYmFja0JvZHkiOiAiYnVja2V0PSR7YnVja2V0fSZvYmplY3Q9JHtvYmplY3R9JnVpZD0ke3g6dWlkfSZvcmRlcj0ke3g6b3JkZXJfaWR9IiwgImNhbGxiYWNrQm9keVR5cGUiOiAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiwgImNhbGxiYWNrU05JIjogZmFsc2V9 HTTP/1.1
      Host: callback-test.oss-cn-hangzhou.aliyuncs.com
      Date: Wed, 26 Apr 2023 03:46:17 GMT
      Content-Length: 5
      Content-Type: text/plain

服務端實現

以下為服務端的處理流程。各語言的程式碼範例請參見服務端程式碼範例

應用伺服器需要具備以下能力:

  1. 接收OSS發送的POST請求

    當檔案上傳成功後,OSS 會根據回調參數,自動向您配置的應用伺服器發送一個POST請求。樣本如下:

    POST /test HTTP/1.1
    Host: your.callback.com
    Connection: close
    Authorization: GevnM3**********3j7AKluzWnubHSVWI4dY3VsIfUHYWnyw==
    Content-MD5: iKU/O/JB***ZMd8Ftg==
    Content-Type: application/x-www-form-urlencoded
    Date: Tue, 07 May 2024 03:06:13 GMT
    User-Agent: aliyun-oss-callback
    x-oss-bucket: your_bucket
    x-oss-pub-key-url: aHR0cHM6Ly9nb3NzcHVi**********vY2FsbGJeV92MS5wZW0=
    x-oss-request-id: 66399AA50*****3334673EC2
    x-oss-requester: 23313******948342006
    x-oss-signature-version: 1.0
    x-oss-tag: CALLBACK
    bucket=your_bucket&object=your_object&uid=12345&order_id=67890
  2. 驗證請求籤名確保安全(可選)

    為確保回調請求來自 OSS,建議在應用伺服器中對請求籤名進行驗證。具體驗證方法,請參見建議配置

    說明

    簽名驗證不是必選項,您可按需決定是否啟用。

  3. 返回回調響應

    應用伺服器收到回調請求後,需要向OSS返迴響應。回調響應必須符合以下要求:

    • 正常情況下,回調伺服器應返回 HTTP/1.1 200 OK。

    • 必須包含Content-Length的Header,大小不得超過3MB。

    • 響應Body必須為JSON格式,大小不能超過1 MB。

    例如,此處應用伺服器返回了{"Status": "OK"}

    HTTP/1.0 200 OK
    Server: BaseHTTP/0.3 Python/2.7.6
    Date: Mon, 14 Sep 2015 12:37:27 GMT
    Content-Type: application/json
    Content-Length: 9
    {"Status": "OK"}

    之後OSS會將該響應內容透傳給用戶端。樣本如下:

    HTTP/1.1 200 OK
    Date: Mon, 14 Sep 2015 12:37:27 GMT
    Content-Type: application/json
    Content-Length: 9
    Connection: keep-alive
    ETag: "D8E8FCA2DC0F896FD7CB4CB0031BA249"
    Server: AliyunOSS
    x-oss-bucket-version: 1442231779
    x-oss-request-id: 55F6BF87207FB30F2640C548
    {"Status": "OK"}
    重要

    對於CompleteMultipartUpload請求,如果原本的響應body中存在內容(例如JSON格式的資訊),啟用上傳回調後,該內容會被回調返回的覆蓋,例如此處被{"Status": "OK"}覆蓋。

建議配置

驗證請求籤名確保安全

在設定回調參數後,OSS會根據您配置的callbackUrl發送POST回調請求到應用伺服器。為確保請求來自OSS,您可以對回調請求中的簽名進行驗證。以下是驗證過程的詳細步驟。

  1. 用戶端產生簽名(由OSS完成)

    OSS 使用 RSA 非對稱式加密演算法,結合 MD5 雜湊,對請求內容產生簽名,並將簽名添加到要求標頭的 authorization 欄位中。

    • 簽名計算方式如下:

      authorization = base64_encode(rsa_sign(private_key, url_decode(path) + query_string + '\n' + body, md5))
      說明

      其中,private_key為私密金鑰,path為回調請求的資源路徑,query_string為查詢字串,body為回調的訊息體。

    • 產生簽名的步驟:

      1. 擷取待簽名字串:資源路徑經過URL解碼後,會附加原始的查詢字串、一個斷行符號符以及回調訊息體。

      2. RSA簽名:使用金鑰組待簽名字串進行簽名,簽名的雜湊函數為md5。

      3. 將簽名後的結果做Base64編碼,擷取最終的簽名,然後將簽名放在回調請求的authorization頭中。

    • 產生簽名的樣本:

      POST /index.php?id=1&index=2 HTTP/1.0
      Host: 172.16.XX.XX
      Connection: close
      Content-Length: 18
      authorization: kKQeGTRccDKyHB3H9vF+xYMSrmhMZj****/kdD1ktNVgbWEfYTQG0G2SU/RaHBovRCE8OkQDjC3uG33esH2t****
      Content-Type: application/x-www-form-urlencoded
      User-Agent: http-client/0.0.1
      x-oss-pub-key-url: aHR0cDovL2dvc3NwdWJsaWMuYWxpY2RuLmNvbS9jYWxsYmFja19wdWJfa2V5X3YxLnsr****
      bucket=examplebucket

      path為/index.php,query_string為?id=1&index=2,body為bucket=examplebucket,最終簽名結果為kKQeGTRccDKyHB3H9vF+xYMSrmhMZjzzl2/kdD1ktNVgbWEfYTQG0G2SU/RaHBovRCE8OkQDjC3uG33esH2t****

  2. 回調伺服器驗證簽名

    您的應用伺服器需對OSS請求進行簽名驗證,以確認請求來源的合法性。驗證步驟如下:

    1. 擷取公開金鑰:

      從要求標頭的 x-oss-pub-key-url 欄位擷取 Base 64 編碼的公開金鑰 URL,並進行解碼。

      public_key = urlopen(base64_decode(x-oss-pub-key-url頭的值))

      解碼前的樣本值:

      aHR0cDovL2dvc3NwdWJsaWMuYWxpY2RuLmNvbS9jYWxsYmFja19wdWJfa2V5X3YxLnBlbQ==

      解碼後:

      http://gosspublic.alicdn.com/callback_pub_key_v1.pem
      說明

      公開金鑰URL必須以http://gosspublic.alicdn.com/或者https://gosspublic.alicdn.com/開頭。由於公開金鑰地址的內容不變,建議緩衝公開金鑰以避免因網路波動影響服務。

    2. 解碼簽名。

      從要求標頭的 authorization 欄位擷取簽名,並進行 Base64 解碼:

      signature = base64_decode(authorization頭的值)
    3. 構造待驗證字串。

      將資源路徑、查詢字串、分行符號和回調訊息體按如下格式拼接:

      sign_str = url_decode(path) + query_string + ‘\n’ + body
    4. 執行簽名驗證。

      使用 MD5 雜湊加 RSA 公開金鑰進行驗證:

      result = rsa_verify(public_key, md5(sign_str), signature)
  3. 驗證簽名樣本

    以Python為例,示範應用伺服器中驗證簽名的方法,此樣本需要安裝M2Crypto庫。

    import httplib
    import base64
    import md5
    import urllib2
    from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
    from M2Crypto import RSA
    from M2Crypto import BIO
    def get_local_ip():
        try:
            csock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
            csock.connect(('8.8.8.8', 80))
            (addr, port) = csock.getsockname()
            csock.close()
            return addr
        except socket.error:
            return ""
    class MyHTTPRequestHandler(BaseHTTPRequestHandler):
        '''
        def log_message(self, format, *args):
            return
        '''
        def do_POST(self):
            #get public key
            pub_key_url = ''
            try:
                pub_key_url_base64 = self.headers['x-oss-pub-key-url']
                pub_key_url = pub_key_url_base64.decode('base64')
                if not pub_key_url.startswith("http://gosspublic.alicdn.com/") and not pub_key_url.startswith("https://gosspublic.alicdn.com/"):
                    self.send_response(400)
                    self.end_headers()
                    return
                url_reader = urllib2.urlopen(pub_key_url)
                #you can cache it,recommend caching public key content based on the public key address
                pub_key = url_reader.read() 
            except:
                print 'pub_key_url : ' + pub_key_url
                print 'Get pub key failed!'
                self.send_response(400)
                self.end_headers()
                return
            #get authorization
            authorization_base64 = self.headers['authorization']
            authorization = authorization_base64.decode('base64')
            #get callback body
            content_length = self.headers['content-length']
            callback_body = self.rfile.read(int(content_length))
            #compose authorization string
            auth_str = ''
            pos = self.path.find('?')
            if -1 == pos:
                auth_str = urllib2.unquote(self.path) + '\n' + callback_body
            else:
                auth_str = urllib2.unquote(self.path[0:pos]) + self.path[pos:] + '\n' + callback_body
            print auth_str
            #verify authorization
            auth_md5 = md5.new(auth_str).digest()
            bio = BIO.MemoryBuffer(pub_key)
            rsa_pub = RSA.load_pub_key_bio(bio)
            try:
                result = rsa_pub.verify(auth_md5, authorization, 'md5')
            except:
                result = False
            if not result:
                print 'Authorization verify failed!'
                print 'Public key : %s' % (pub_key)
                print 'Auth string : %s' % (auth_str)
                self.send_response(400)
                self.end_headers()
                return
            #do something according to callback_body
            #response to OSS
            resp_body = '{"Status":"OK"}'
            self.send_response(200)
            self.send_header('Content-Type', 'application/json')
            self.send_header('Content-Length', str(len(resp_body)))
            self.end_headers()
            self.wfile.write(resp_body)
    class MyHTTPServer(HTTPServer):
        def __init__(self, host, port):
            HTTPServer.__init__(self, (host, port), MyHTTPRequestHandler)
    if '__main__' == __name__:
        server_ip = get_local_ip()
    server_port = 23451
    server = MyHTTPServer(server_ip, server_port)
    server.serve_forever()

    其他語言的服務端代碼請參見下表。

    SDK語言

    描述

    Java

    • 下載地址:Java

    • 運行方法:解壓包運行java -jar oss-callback-server-demo.jar 9000(9000指啟動並執行連接埠,可以自行指定)。

    Python

    • 下載地址:Python

    • 運行方法:解壓包直接運行python callback_app_server.py,運行該程式需要安裝RSA的依賴。

    PHP

    • 下載地址:PHP

    • 運行方法:部署到Apache環境下,因為PHP本身語言的特點,取一些資料頭部會依賴於環境。所以可以參考例子根據所在環境修改。

    .NET

    • 下載地址:.NET

    • 運行方法:解壓後參看README.md

    Node.js

    • 下載地址:Node.js

    • 運行方法:解壓包直接運行node example.js

    Ruby

    • 下載地址:Ruby

    • 運行方法:ruby aliyun_oss_callback_server.rb

callback參數詳情

以下是callback參數的詳細說明,用於配置OSS檔案上傳成功後的回調請求內容與行為。

欄位

是否必選

描述

callbackUrl

檔案上傳成功後,OSS向此URL發送POST回調請求。

  • 支援同時配置最多5個URL,多個URL間以分號(;)分隔。OSS會依次發送請求,直到第一個回調請求成功返回。

  • 支援HTTPS協議地址。

  • 不支援填寫IPV6地址,也不支援填寫指向IPV6地址的網域名稱。

  • 為了保證正確處理中文等情況,callbackUrl需做URL編碼處理,例如https://example.com/中文.php?key=value&中文名稱=中文值需要編碼為https://example.com/%E4%B8%AD%E6%96%87.php?key=value&%E4%B8%AD%E6%96%87%E5%90%8D%E7%A7%B0=%E4%B8%AD%E6%96%87%E5%80%BC

callbackBody

發起回調時請求體的內容,格式需與 callbackType 參數保持一致:

  • 當 callbackType 為預設值application/x-www-form-urlencoded時,callbackBody 應為索引值對格式,例如:bucket=${bucket}&object=${object}&my_var_1=${x:my_var1}&my_var_2=${x:my_var2}

  • 當 callbackType 為application/json時,callbackBody 應為 JSON格式,例如:{\"bucket\":${bucket},\"object\":${object},\"mimeType\":${mimeType},\"size\":${size},\"my_var1\":${x:my_var1},\"my_var2\":${x:my_var2}}

callbackBody 支援引用 OSS 系統參數、自訂變數和常量。系統參數說明請參見callbackBody支援的系統參數

callbackHost

發起回調請求時Host頭的值,格式為網域名稱或IP地址。

  • 如果沒有配置callbackHost,則解析callbackUrl中的URL,並將解析的Host填充到callbackHost中。

callbackSNI

是否在回調請求中攜帶 SNI(用 HTTPS請求中標識網域名稱並返回正確認證)。

當 callbackUrl 使用 HTTPS 時,建議開啟該參數,否則可能因認證不匹配導致回調失敗(如 502 callback failed)。取值如下:

  • true:發送SNI。

  • false(預設值):不發送SNI。

    說明

    英國(倫敦)地區始終發送SNI,不受此參數控制。

callbackBodyType

發起回調請求的Content-Type,即callbackBody的資料格式。

支援以下兩種類型:

  • application/x-www-form-urlencoded(預設值)

    將經過URL編碼的值替換callbackBody中的變數。

  • application/json

    按照JSON格式替換callbackBody中的變數。

callbackBody支援的系統參數

callback參數中callbackBody欄位支援引用多個系統參數,用於在回調請求中傳遞上傳檔案的相關資訊。支援的系統參數如下表所示:

系統參數

含義

bucket

儲存空間名稱。

object

對象(檔案)的完整路徑。

etag

檔案的ETag,即返回給使用者的ETag欄位。

size

Object大小。調用CompleteMultipartUpload時,size為整個Object的大小。

mimeType

資源類型,例如jpeg圖片的資源類型為image/jpeg。

imageInfo.height

圖片高度。該變數僅適用於圖片格式,對於非圖片格式,該變數的值為空白。

imageInfo.width

圖片寬度。該變數僅適用於圖片格式,對於非圖片格式,該變數的值為空白。

imageInfo.format

圖片格式,例如JPG、PNG等。該變數僅適用於圖片格式,對於非圖片格式,該變數的值為空白。

crc64

與上傳檔案後返回的x-oss-hash-crc64ecma頭內容一致。

contentMd5

與上傳檔案後返回的Content-MD5頭內容一致。

重要

僅在調用PutObject和PostObject介面上傳檔案時,該變數的值不為空白。

vpcId

發起請求的用戶端所在的VpcId。如果不是通過VPC發起請求,則該變數的值為空白。

clientIp

發起請求的用戶端IP地址。

reqId

發起請求的RequestId。

operation

發起請求的介面名稱,例如PutObject、PostObject等。

SDK

以下為用戶端實現的樣本demo。

簡單上傳

(使用PutObject介面)

分區上傳

(使用CompleteMultipartUpload介面)

使用預簽名URL上傳

(使用PutObject介面)

Java

demo

demo

demo

Python V2

demo

-

demo

Go V2

demo

demo

demo

錯誤排查

OSS返回的錯誤資訊中包含EC錯誤碼,使用Callback過程若出現錯誤,您可以使用EC碼進行排查。EC碼與錯誤原因一一對應。與Callback相關的EC錯誤碼,請參見07-CALLBACK

常見問題

OSS上傳檔案失敗後是否會發送回調通知給應用伺服器?

不會。OSS上傳檔案成功後會執行回調,如果上傳失敗,則不執行回調,直接返回錯誤資訊。

報錯Response body is not valid json format.如何處理?

  • 應用伺服器處理過程中拋出異常,導致返回給OSS的Body不是JSON格式,如下圖所示:callback

    解決方案:

    • 通過以下命令確認內容。

      curl -d "<Content>" <CallbackServerURL> -v
    • 通過抓包確認內容。

      Windows下推薦使用工具Wireshark抓包,Linux下使用命令tcpdump抓包。

  • 應用伺服器返回給OSS的Body中帶有BOM頭。

    這類錯誤常見於使用PHP SDK編寫的應用伺服器中。由於PHP SDK返回了BOM頭,導致OSS收到的Body中多了三個位元組,出現不符合JSON格式的Body。如下圖所示,ef bb bf這三個位元組為BOM頭。

    callback1

    解決方案:刪除應用伺服器返回OSS Body中的BOM頭。