閱讀943 返回首頁    go 小米 go MIUI米柚


服務端簽名直傳並設置上傳回調__Web端直傳實踐_最佳實踐_對象存儲 OSS-阿裏雲

背景

請參考 Web端直傳實踐 裏的背景介紹。

當采用服務端簽名後直傳方案後,問題來了,用戶上傳數據後,很多場景下,應用服務器都要知道用戶上傳了哪些文件,文件名字,甚至如果是圖片的話,圖片的大小等。為此OSS開發了上傳回調功能。

用戶的請求邏輯

  1. 用戶向應用服務器取到上傳policy和回調設置。
  2. 應用服務器返回上傳policy和回調。
  3. 用戶直接向OSS發送文件上傳請求。
  4. 等文件數據上傳完,OSS給用戶Response前,OSS會根據用戶的回調設置,請求用戶的服務器。
  5. 如果應用服務器返回成功,那麼就返回用戶成功,如果應用服務器返回失敗,那麼OSS也返回給用戶失敗。這樣確保了用戶上傳成功的照片,應用服務器都已經收到通知了。
  6. 應用服務器給OSS返回。
  7. OSS將應用服務器返回的內容返回給用戶。

簡單講,就是用戶要上載一個文件到OSS服務器,而且希望上載完畢的時候自己的應用服務能夠知道這件事,這時就需要設置一個回調函數,把這件事告知用戶的應用服務器。這樣當OSS收到用戶的上傳請求之後,開始上傳,傳完之後不會直接給用戶返回結果,而是先通知用戶的應用服務器:“我上傳完畢了”,然後應用服務器告訴OSS:“我知道啦,你幫我轉達給我的主人吧”,於是OSS就把結果轉達給用戶了。

示例

用戶電腦瀏覽器測試樣例:點擊這裏體驗上傳回調示例

用手機測試該上傳是否有效。可以用手機(微信、QQ、手機瀏覽器等)掃一掃二維碼試試(這個不是廣告,隻是上述網址的二維碼,為了讓大家看一下這個實現能在手機端完美運行)。

代碼下載

點擊這裏:oss-h5-upload-js-php-callback.zip

例子是采用後端簽名,語言是用PHP。

其他語言的用法:

  1. 下載對應的語言示例。
  2. 然後修改示例代碼,如設置監聽的端口等,然後運行。
  3. 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會回調通知到用戶設置的應用服務器。

  1. 設置成自己的 id、key、bucket。
    設置方法:修改php/get.php,將變量$id設成AccessKeyId,$key設置成AccessKeySecret,$host設置成 bucket+endpoint。
    1. $id= 'xxxxxx';
    2. $key= 'xxxxx';
    3. $host = 'https://post-test.oss-cn-hangzhou.aliyuncs.com
  2. 為了瀏覽安全,必須為bucket設置Cors, 參照下文。

  3. 設置自己的回調URL,如https://abc.com/test.html (必須公網訪問得通),即自己的回調服務器地址,OSS會在文件上傳完成後,把文件上傳信息,通過自己設置的回調URL(https://abc.com/test.html)發送給應用服務器。
    設置方法:修改php/get.php,(這個回調服務端代碼實例參考下文)

  1. $callbackUrl = "https://abc.com/test.html";

這個例子裏麵更多細節 ,如上傳簽名,設置隨機文件名等更多細節可以參照:點擊這裏,了解上傳更多細節

下麵講解一下核心邏輯。

核心代碼解析

代碼要添加的內容如下:

  1. new_multipart_params = {
  2. 'key' : key + '${filename}',
  3. 'policy': policyBase64,
  4. 'OSSAccessKeyId': accessid,
  5. 'success_action_status' : '200', //讓服務端返回200,不然,默認會返回204
  6. 'callback':  callbackbody,
  7. 'signature': signature,
  8. };

上述的callbackbody 是php服務端返回的。在本例中,從後端php取到的內容如下:

  1. {"accessid":"6MKOqxGiGU4AUk44",
  2. "host":"https://post-test.oss-cn-hangzhou.aliyuncs.com",
  3. "policy":"eyJleHBpcmF0aW9uIjoiMjAxNS0xMS0wNVQyMDo1MjoyOVoiLCJjdb25kaXRpb25zIjpbWyJjdb250ZW50LWxlbmd0aC1yYW5nZSIsMCwxMDQ4NTc2MDAwXSxbInN0YXJ0cy13aXRoIiwiJGtleSIsInVzZXItZGlyXC8iXV19",
  4. "signature":"VsxOcOudxDbtNSvz93CLaXPz+4s=",
  5. "expire":1446727949,
  6. "callback":"eyJjYWxsYmFja1VybCI6Imh0dHA6Ly9vc3MtZGVtby5hbGl5dW5jcy5jdb206MjM0NTAiLCJjYWxsYmFja0hvc3QiOiJvc3MtZGVtby5hbGl5dW5jcy5jdb20iLCJjYWxsYmFja0JvZHkiOiJmaWxlbmFtZT0ke29iamVjdH0mc2l6ZT0ke3NpemV9Jm1pbWVUeXBlPSR7bWltZVR5cGV9JmhlaWdodD0ke2ltYWdlSW5mby5oZWlnaHR9JndpZHRoPSR7aW1hZ2VJdbmZvLndpZHRofSIsImNhbGxiYWNrQm9keVR5cGUiOiJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQifQ==","dir":"user-dirs/"}

上麵提到callbackbody,就是上述返回結果裏麵的callback內容,經過base64編碼後生成的。

解碼後的內容如下:

  1. {"callbackUrl":"https://oss-demo.aliyuncs.com:23450",
  2. "callbackHost":"oss-demo.aliyuncs.com",
  3. "callbackBody":"filename=${object}&size=${size}&mimeType=${mimeType}&height=${imageInfo.height}&width=${imageInfo.width}",
  4. "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為例,具體設置方法為:

    1. 打開rewrite模塊,執行命令:a2enmod rewrite;
    2. 修改配置文件 /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

總結

最後更新:2016-11-23 16:04:09

  上一篇:go 服務端簽名後直傳__Web端直傳實踐_最佳實踐_對象存儲 OSS-阿裏雲
  下一篇:go CDN加速OSS__存儲空間管理_最佳實踐_對象存儲 OSS-阿裏雲