服務端簽名直傳並設置上傳回調__Web端直傳實踐_最佳實踐_對象存儲 OSS-阿裏雲
背景
請參考 Web端直傳實踐 裏的背景介紹。
當采用服務端簽名後直傳方案後,問題來了,用戶上傳數據後,很多場景下,應用服務器都要知道用戶上傳了哪些文件,文件名字,甚至如果是圖片的話,圖片的大小等。為此OSS開發了上傳回調功能。
用戶的請求邏輯
- 用戶向應用服務器取到上傳policy和回調設置。
- 應用服務器返回上傳policy和回調。
- 用戶直接向OSS發送文件上傳請求。
- 等文件數據上傳完,OSS給用戶Response前,OSS會根據用戶的回調設置,請求用戶的服務器。
- 如果應用服務器返回成功,那麼就返回用戶成功,如果應用服務器返回失敗,那麼OSS也返回給用戶失敗。這樣確保了用戶上傳成功的照片,應用服務器都已經收到通知了。
- 應用服務器給OSS返回。
- OSS將應用服務器返回的內容返回給用戶。
簡單講,就是用戶要上載一個文件到OSS服務器,而且希望上載完畢的時候自己的應用服務能夠知道這件事,這時就需要設置一個回調函數,把這件事告知用戶的應用服務器。這樣當OSS收到用戶的上傳請求之後,開始上傳,傳完之後不會直接給用戶返回結果,而是先通知用戶的應用服務器:“我上傳完畢了”,然後應用服務器告訴OSS:“我知道啦,你幫我轉達給我的主人吧”,於是OSS就把結果轉達給用戶了。
示例
用戶電腦瀏覽器測試樣例:點擊這裏體驗上傳回調示例
用手機測試該上傳是否有效。可以用手機(微信、QQ、手機瀏覽器等)掃一掃二維碼試試(這個不是廣告,隻是上述網址的二維碼,為了讓大家看一下這個實現能在手機端完美運行)。
代碼下載
點擊這裏:oss-h5-upload-js-php-callback.zip
例子是采用後端簽名,語言是用PHP。
其他語言的用法:
- 下載對應的語言示例。
- 然後修改示例代碼,如設置監聽的端口等,然後運行。
- 在
oss-h5-upload-js-php-callback.zip
裏麵的upload.js, 將裏麵的變量severUrl改成第2步部署的地址。如severUrl =http:/1.2.3.4:8080
或者serverUrl=https://abc.com/post/
快速使用
隻要以下三步,就能實現文件快速通過網頁上傳到OSS,並且OSS會回調通知到用戶設置的應用服務器。
- 設置成自己的 id、key、bucket。
設置方法:修改php/get.php
,將變量$id設成AccessKeyId,$key設置成AccessKeySecret,$host設置成 bucket+endpoint。$id= 'xxxxxx';
$key= 'xxxxx';
$host = 'https://post-test.oss-cn-hangzhou.aliyuncs.com
為了瀏覽安全,必須為bucket設置Cors, 參照下文。
設置自己的回調URL,如
https://abc.com/test.html
(必須公網訪問得通),即自己的回調服務器地址,OSS會在文件上傳完成後,把文件上傳信息,通過自己設置的回調URL(https://abc.com/test.html
)發送給應用服務器。
設置方法:修改php/get.php,(這個回調服務端代碼實例參考下文)
$callbackUrl = "https://abc.com/test.html";
這個例子裏麵更多細節 ,如上傳簽名,設置隨機文件名等更多細節可以參照:點擊這裏,了解上傳更多細節。
下麵講解一下核心邏輯。
核心代碼解析
代碼要添加的內容如下:
new_multipart_params = {
'key' : key + '${filename}',
'policy': policyBase64,
'OSSAccessKeyId': accessid,
'success_action_status' : '200', //讓服務端返回200,不然,默認會返回204
'callback': callbackbody,
'signature': signature,
};
上述的callbackbody 是php服務端返回的。在本例中,從後端php取到的內容如下:
{"accessid":"6MKOqxGiGU4AUk44",
"host":"https://post-test.oss-cn-hangzhou.aliyuncs.com",
"policy":"eyJleHBpcmF0aW9uIjoiMjAxNS0xMS0wNVQyMDo1MjoyOVoiLCJjdb25kaXRpb25zIjpbWyJjdb250ZW50LWxlbmd0aC1yYW5nZSIsMCwxMDQ4NTc2MDAwXSxbInN0YXJ0cy13aXRoIiwiJGtleSIsInVzZXItZGlyXC8iXV19",
"signature":"VsxOcOudxDbtNSvz93CLaXPz+4s=",
"expire":1446727949,
"callback":"eyJjYWxsYmFja1VybCI6Imh0dHA6Ly9vc3MtZGVtby5hbGl5dW5jcy5jdb206MjM0NTAiLCJjYWxsYmFja0hvc3QiOiJvc3MtZGVtby5hbGl5dW5jcy5jdb20iLCJjYWxsYmFja0JvZHkiOiJmaWxlbmFtZT0ke29iamVjdH0mc2l6ZT0ke3NpemV9Jm1pbWVUeXBlPSR7bWltZVR5cGV9JmhlaWdodD0ke2ltYWdlSW5mby5oZWlnaHR9JndpZHRoPSR7aW1hZ2VJdbmZvLndpZHRofSIsImNhbGxiYWNrQm9keVR5cGUiOiJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQifQ==","dir":"user-dirs/"}
上麵提到callbackbody,就是上述返回結果裏麵的callback內容,經過base64編碼後生成的。
解碼後的內容如下:
{"callbackUrl":"https://oss-demo.aliyuncs.com:23450",
"callbackHost":"oss-demo.aliyuncs.com",
"callbackBody":"filename=${object}&size=${size}&mimeType=${mimeType}&height=${imageInfo.height}&width=${imageInfo.width}",
"callbackBodyType":"application/x-www-form-urlencoded"}
內容的解析如下:
- CallbackUrl: OSS往這個機器發送的url請求。
- callbackHost: OSS發送這個請求時,請求頭部所帶的Host頭。
- callbackBody: OSS請求時,發送給應用服務器的內容,可以包括文件的名字、大小、類型,如果是圖片可以是圖片的高度、寬度。
- callbackBodyType: 請求發送的Content-Type。
回調應用服務器
在用戶的請求邏輯中,很重要的地方就是第4步和第5步,OSS與應用服務器交互的時候,用戶可能會有以下疑問:
問題1:如果我是開發者,那麼我要怎麼樣確認請求是從OSS發送過來的呢?
答案:OSS發送請求時,會跟應用服務器構造簽名。兩者通過簽名保證。
問題2:這個簽名是怎麼做的?或者有示例代碼嗎?
答案:有的。上麵的例子裏麵是Callback應用服務器的例子:
https://oss-demo.aliyuncs.com:23450
(目前隻支持Linux)。
上麵運行的代碼是:callback_app_server.py.zip
運行方案:在Linux下麵直接執行裏麵的文件python callback_app_server.py
即可,程序自實現了一個簡單的http server,運行該程序可能需要安裝rsa的依賴。問題3: 為何我的應用服務器收到的回調請求沒有Authotization頭?
答案:有些 Web server會將Authorization頭自行解析掉,比如apache2,因此需要設置成不解析這個頭部。以apache2為例,具體設置方法為:
- 打開rewrite模塊,執行命令:a2enmod rewrite;
- 修改配置文件
/etc/apache2/apache2.conf
(apache2的安裝路徑不同會有不一樣)。將Allow Override設置成All,然後添加下麵兩條配置:
RewriteEngine on
RewriteRule .* - [env=HTTP_AUTHORIZATION:%{HTTP:Authorization},last]
示例程序隻是完成了如何檢查應用服務器收到的簽名, 用戶要自行增加對應用服務器收到回調的內容的格式解析 。
其他語言的回調應用服務器版本
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
總結
- 第一個例子:講解如何在JavaScript直接簽名,直接表單上傳到OSS。 oss-h5-upload-js-direct.tar.gz
- 第二個例子:講解如何在從後端PHP獲取簽名,然後直接表單上傳到OSS。 oss-h5-upload-js-php.tar.gz
- 第三個例子:講解如何在從後端PHP獲取簽名及上傳後回調。然後直接表單上傳到OSS,OSS回調完應用服務器再返回給用戶。 oss-h5-upload-js-php-callback.tar.gz
最後更新:2016-11-23 16:04:09
上一篇:
服務端簽名後直傳__Web端直傳實踐_最佳實踐_對象存儲 OSS-阿裏雲
下一篇:
CDN加速OSS__存儲空間管理_最佳實踐_對象存儲 OSS-阿裏雲
阿裏雲 Python SDK 列表__用戶指南_命令行工具 CLI-阿裏雲
表數據量統計__擴展工具_用戶指南(RDBMS)_數據管理-阿裏雲
滑動驗證插件__使用手冊_數據風控-阿裏雲
CreateVirtualMFADevice__用戶管理接口_RAM API文檔_訪問控製-阿裏雲
SnapshotType__數據類型_API 參考_雲服務器 ECS-阿裏雲
刪除存儲空間__快速入門_對象存儲 OSS-阿裏雲
標簽列表__API列表_OpenAPI 1.0_移動推送-阿裏雲
采用MySQLdump工具遷移__數據管理工具(DMS)使用_產品使用問題_雲數據庫 RDS 版-阿裏雲
錄製測試腳本__腳本開發_Lite用戶使用手冊_性能測試-阿裏雲
查詢消費端連接__消費管理相關接口_Open API_消息隊列 MQ-阿裏雲
相關內容
常見錯誤說明__附錄_大數據計算服務-阿裏雲
發送短信接口__API使用手冊_短信服務-阿裏雲
接口文檔__Android_安全組件教程_移動安全-阿裏雲
運營商錯誤碼(聯通)__常見問題_短信服務-阿裏雲
設置短信模板__使用手冊_短信服務-阿裏雲
OSS 權限問題及排查__常見錯誤及排除_最佳實踐_對象存儲 OSS-阿裏雲
消息通知__操作指南_批量計算-阿裏雲
設備端快速接入(MQTT)__快速開始_阿裏雲物聯網套件-阿裏雲
查詢API調用流量數據__API管理相關接口_API_API 網關-阿裏雲
使用STS訪問__JavaScript-SDK_SDK 參考_對象存儲 OSS-阿裏雲