背景
快速搭建行動裝置 App直傳服務介紹了如何在30分鐘內中搭建一個基於OSS的行動裝置 App數據直傳服務。移動端開發場景流程圖如下:

角色分析如下所示:
-
應用伺服器負責為Android/iOS行動裝置 App生成STS憑證。
-
Android/iOS行動裝置 App負責從應用伺服器申請及使用STS憑證。
-
OSS負責處理行動裝置 App的數據請求。
對於Android/iOS移動應來說,行動裝置 App只需要執行上圖中操作1(申請STS憑證),就能調用多次5(使用該STS憑證上傳數據到OSS),導致應用伺服器根本不知道用戶都上傳了哪些數據 ,作為該APP的開發人員,就沒法對應用上傳數據進行管理。有什麼問題能讓應用伺服器感知到Android/iOS行動裝置 App上傳的數據呢?
您可以通過使用OSS的上傳回調服務,就能解決上述問題,如下圖所示:

OSS在收到Android/iOS移動的數據(上圖中操作5)和在返回用戶上傳結果(上圖中操作6)之間,觸發一個上傳回調工作。即第上圖中操作5.5,先回調使用者服務器,得到應用伺服器返回的內容,將這個內容返回給Android/iOS行動裝置 App。可以參考Callback API文檔。
上傳回調的作用
- 通過上傳回調可以讓用戶應用伺服器知道當前上傳檔案的基本資料。
基本資料如下表。返回下述變數的一個或者多個,返回內容格式形式在Android/iOS上傳時指定。
系統變數 含義 bucket 行動裝置 App上傳到哪個儲存空間 object 行動裝置 App上傳到OSS保存的檔案名 etag 該上傳的檔案的etag,即返回給用戶的etag欄位 size 該上傳的檔案的大小 mimeType 資源類型 imageInfo.height 圖片高度 imageInfo.width 圖片寬度 imageInfo.format 圖片格式,如jpg、png,只以識別圖片 - 通過上傳回調設定自訂參數,達到資訊傳遞目的。
假如您是一個開發人員,您想知道目前使用者所使用的APP版本、目前使用者所在的作業系統版本、用戶的GPS資訊、用戶的手機型號。您可以在Android/iOS端上傳檔案時,指定上述自訂參數,如下所示:
-
x:version指定APP版本
-
x:system指定作業系統版本
-
x:gps指定GPS資訊
-
x:phone指定手機型號
上述這些值會在Android/iOS行動裝置 App上傳到OSS時附帶上,OSS會把這些值放到CallbackBody裡面一起發給應用伺服器。這樣應用伺服器就能收到這些資訊,達到資訊傳遞的目的。
-
在行動裝置 App端設定上傳回調
要讓OSS在接收上傳請求時,觸發上傳回調,行動裝置 App在構造上傳請求時必須把如下兩個內容指定到上傳請求裡面:
- 要回調到哪個伺服器callbackUrl,如
http://abc.com/callback.php
,這個地址必須是公網能夠訪問的。 - 上傳回調給應用伺服器的內容callbackBody,可以是上述OSS返回應用伺服器系統變數的一個或者多個。
假如您的使用者服務器上傳回調地是http://abc.com/callback.php
。您想獲取手機上傳的檔案名字、檔案的大小,並且定義了photo變數是指手機型號,system是指作業系統版本。
上傳回調樣本分以下兩種:
- iOS指定上傳回調樣本:
OSSPutObjectRequest * request = [OSSPutObjectRequest new]; request.bucketName = @"<bucketName>"; request.objectKey = @"<objectKey>"; request.uploadingFileURL = [NSURL fileURLWithPath:@<filepath>"]; // 設定回調參數 request.callbackParam = @{ @"callbackUrl": @"http://abc.com/callback.php", @"callbackBody": @"filename=${object}&size=${size}&photo=${x:photo}&system=${x:system}" }; // 設定自訂變數 request.callbackVar = @{ @"x:photo": @"iphone6s", @"x:system": @"ios9.1" };
- Android指定上傳回調樣本:
PutObjectRequest put = new PutObjectRequest(testBucket, testObject, uploadFilePath); ObjectMetadata metadata = new ObjectMetadata(); metadata.setContentType("application/octet-stream"); put.setMetadata(metadata); put.setCallbackParam(new HashMap<String, String>() { { put("callbackUrl", "http://abc.com/callback.php"); put("callbackBody", "filename=${object}&size=${size}&photo=${x:photo}&system=${x:system}"); } }); put.setCallbackVars(new HashMap<String, String>() { { put("x:photo", "IPOHE6S"); put("x:system", "YunOS5.0"); } });
上傳回調對應用伺服器的要求
-
您必須部署一個可以接收POST請求的服務,這個服務必須有公網地址如
www.abc.com/callback.php
(或者外網IP也可以),不然OSS沒有辦法訪問到這個地址。 -
您要給OSS正確的返回,返回格式必須是JSON格式,內容自訂。因為OSS會把應用伺服器返回的內容,原封不動地返回給Android/iOS行動裝置 App。(切記,返回給OSS的Response Header一定要加上Content-Length這個頭部)。
本教程在最後為大家準備了多個語言版本的樣本、下載及運行方法。
應用伺服器收到的回調請求
應用伺服器收到OSS的請求,抓包的請求如下(這個結果根據設定的不同URL和回調內容會有不同):
POST /index.html HTTP/1.0
Host: 121.43.113.8
Connection: close
Content-Length: 81
Content-Type: application/x-www-form-urlencoded
User-Agent: ehttp-client/0.0.1
authorization: kKQeGTRccDKyHB3H9vF+xYMSrmhMZjzzl2/kdD1ktNVgbWEfYTQG0G2SU/RaHBovRCE8OkQDjC3uG33esH2txA==
x-oss-pub-key-url: aHR0cDovL2dvc3NwdWJsaWMuYWxpY2RuLmNvbS9jYWxsYmFja19wdWJfa2V5X3YxLnBlbQ==
filename=test.txt&size=5&photo=iphone6s&system=ios9.1
更多內容請參考Callback API文檔。
應用伺服器判斷回調請求是否來自OSS
如果您的回調伺服器被人惡意攻擊了,例如惡意回調您的應用伺服器,導致應用伺服器收到一些非法的請求,影響正常邏輯,此時您就需要判斷回調請求是否來自OSS。
判斷的方法主要是利用OSS給應用伺服器返回的頭部內容中, x-oss-pub-key-url
和authorization
這兩個參數進行RSA校驗。只有通過RSA校驗才能說明這個請求是來自OSS,本教程提供的樣本程式都有實現的樣本供您參考。
應用伺服器收到回調請求後的處理
filename=test.txt&size=5&photo=iphone6s&system=ios9.1
應用伺服器就可以根據OSS的返回內容,解析得到自己想要得到的數據。得到這個數據後,應用伺服器可以把數據存放起來,方便後續管理。
應用伺服器收到回調請求後如何返回給OSS
- 返回狀態碼是200;
- 返回必須是json格式的內容;
- 返回的頭部必須帶有Content-Length這個頭部。
OSS如何處理應用伺服器的返回內容
有兩種情況:
-
OSS將回調請求發送給應用伺服器,但是應用伺服器接收失敗或者訪問不通,OSS會返回給Android/iOS行動裝置 App203的狀態碼,但是數據已經存放到OSS上了。
-
應用伺服器接收到OSS的回調請求,並且正確返回了,OSS會返回給Android/iOS行動裝置 App狀態碼是200, 並把應用伺服器給OSS的內容,原封不動地返回給Android/iOS行動裝置 App。
上傳回調伺服器樣本程式下載
樣本程式只是完成了如何檢查應用伺服器收到的簽名, 用戶要自行增加對應用伺服器收到回調的內容的格式解析 。
- Java版本:
- 下載地址:單擊這裡。
- 運行方法,解壓包運行
java -jar oss-callback-server-demo.jar 9000
(9000是啟動並執行通信埠,可以自己指定)。说明 這個jar例子在java 1.7運行通過,如果有問題可以自己依據提供的代碼進行修改。這是一個maven項目。
- PHP版本:
- 下載地址:單擊這裡
- 運行方法:部署到Apache環境下,因為PHP本身語言的特點,取一些數據頭部會依賴於環境。所以可以參考例子根據自己所在環境進行修改。
- Python版本:
- 下載地址:單擊這裡。
- 運行方法:解壓包直接運行python callback_app_server.py即可,程式自實現了一個簡單的http server,運行該程式可能需要安裝rsa的依賴。
- Ruby版本:
- 下載地址:單擊這裡。
- 運行方法: ruby aliyun_oss_callback_server.rb。