OSS支援在檔案上傳後自動觸發回調,通知應用伺服器執行後續操作。
使用限制
地區限制
華東1(杭州)、華東2(上海)、華北1(青島)、華北2(北京)、華北 3(張家口)、華北5(呼和浩特)、華北6(烏蘭察布)、華南1(深圳)、華南2(河源)、華南3(廣州)、西南1(成都)、中國香港、美國(矽谷)、美國(維吉尼亞)、日本(東京)、新加坡、馬來西亞(吉隆坡)、印尼(雅加達)、菲律賓(馬尼拉)、德國(法蘭克福)、英國(倫敦)、阿聯酋(杜拜)地區支援設定Callback。
回調行為說明
回調請求必須在5秒內響應,逾時將視為失敗。
回調失敗不影響檔案上傳成功。
回調失敗不會自動重試。
介面支援
PutObject、PostObject、CompleteMultipartUpload介面支援設定 Callback。V2 SDK 基於以上基礎介面封裝的檔案上傳管理器、預簽名 URL 也支援設定 Callback。
回調流程概覽
OSS 回調具體步驟如下:
用戶端上傳檔案(附帶回調參數)
上傳檔案時,用戶端需要攜帶 Callback 參數,指定回調伺服器的地址和回調內容。若需要傳遞自訂變數,還可以選擇附加callback-var參數。
OSS 隱藏檔並發送回調請求
檔案上傳成功後,OSS 以 POST 方式向回調 URL 發送請求,包含檔案資訊(如 bucket、object、size、ETag等)及自訂參數。
伺服器處理回調並返迴響應
伺服器接收回調請求後,驗證請求籤名(可選)以確保安全,5 秒內完成處理並返回 JSON 響應。HTTP 狀態代碼 200 表示成功,非 200 視為回調失敗。
OSS 返回上傳結果
在回調響應成功後,OSS會根據應用伺服器的返回結果向用戶端提供最終處理結果。
開發實現指南
上傳回調的調試包含兩部分:用戶端上傳和服務端回調處理。建議先調試用戶端上傳部分,再調試應用伺服器部分,兩部分均調試完成後,再進行完整的聯調驗證。
用戶端實現
以下內容主要說明上傳回調參數的構造邏輯與處理流程。如需快速實現上傳回調功能,建議參考SDK提供的範例程式碼。
為了讓 OSS 在檔案上傳完成後自動觸發回調,您需要通過上傳請求傳入兩個參數:callback和(可選的)callback-var。
構造callback參數。
該參數用於定義應用伺服器位址、請求內容格式等資訊,必須以 JSON 格式構造並進行 Base 64 編碼。
最簡配置樣本:
{ "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支援的系統參數。
進階配置樣本:
{ "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參數詳情。
構造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
在構造好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=
將編碼後的參數附加到請求中。
完成編碼後,您可以通過以下方式將編碼後的參數傳遞給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
服務端實現
以下為服務端的處理流程。各語言的程式碼範例請參見服務端程式碼範例。
應用伺服器需要具備以下能力:
接收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
驗證請求籤名確保安全(可選)
為確保回調請求來自 OSS,建議在應用伺服器中對請求籤名進行驗證。具體驗證方法,請參見建議配置。
說明簽名驗證不是必選項,您可按需決定是否啟用。
返回回調響應
應用伺服器收到回調請求後,需要向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,您可以對回調請求中的簽名進行驗證。以下是驗證過程的詳細步驟。
用戶端產生簽名(由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為回調的訊息體。
產生簽名的步驟:
擷取待簽名字串:資源路徑經過URL解碼後,會附加原始的查詢字串、一個斷行符號符以及回調訊息體。
RSA簽名:使用金鑰組待簽名字串進行簽名,簽名的雜湊函數為md5。
將簽名後的結果做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****
。
回調伺服器驗證簽名
您的應用伺服器需對OSS請求進行簽名驗證,以確認請求來源的合法性。驗證步驟如下:
擷取公開金鑰:
從要求標頭的 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/
開頭。由於公開金鑰地址的內容不變,建議緩衝公開金鑰以避免因網路波動影響服務。解碼簽名。
從要求標頭的 authorization 欄位擷取簽名,並進行 Base64 解碼:
signature = base64_decode(authorization頭的值)
構造待驗證字串。
將資源路徑、查詢字串、分行符號和回調訊息體按如下格式拼接:
sign_str = url_decode(path) + query_string + ‘\n’ + body
執行簽名驗證。
使用 MD5 雜湊加 RSA 公開金鑰進行驗證:
result = rsa_verify(public_key, md5(sign_str), signature)
驗證簽名樣本
以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回調請求。
|
callbackBody | 是 | 發起回調時請求體的內容,格式需與 callbackType 參數保持一致:
callbackBody 支援引用 OSS 系統參數、自訂變數和常量。系統參數說明請參見callbackBody支援的系統參數。 |
callbackHost | 否 | 發起回調請求時Host頭的值,格式為網域名稱或IP地址。
|
callbackSNI | 否 | 是否在回調請求中攜帶 SNI(用 HTTPS請求中標識網域名稱並返回正確認證)。 當 callbackUrl 使用 HTTPS 時,建議開啟該參數,否則可能因認證不匹配導致回調失敗(如 502 callback failed)。取值如下:
|
callbackBodyType | 否 | 發起回調請求的Content-Type,即 支援以下兩種類型:
|
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 | |||
Python V2 | - | ||
Go V2 |
錯誤排查
OSS返回的錯誤資訊中包含EC錯誤碼,使用Callback過程若出現錯誤,您可以使用EC碼進行排查。EC碼與錯誤原因一一對應。與Callback相關的EC錯誤碼,請參見07-CALLBACK。
常見問題
OSS上傳檔案失敗後是否會發送回調通知給應用伺服器?
不會。OSS上傳檔案成功後會執行回調,如果上傳失敗,則不執行回調,直接返回錯誤資訊。
報錯Response body is not valid json format.如何處理?
應用伺服器處理過程中拋出異常,導致返回給OSS的Body不是JSON格式,如下圖所示:
解決方案:
通過以下命令確認內容。
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頭。
解決方案:刪除應用伺服器返回OSS Body中的BOM頭。