天天看點

阿裡雲oss - 檔案上傳1 Authorization的計算方式2 修改檔案的中繼資料

寫在前面

阿裡雲oss的各種sdk,都是對它的API進行的封裝。是以如果我們直接調用API時出錯,卻又不知道哪裡出問題時,可以直接閱讀sdk的源碼,找到問題所在。
           

1 Authorization的計算方式

首先貼一下阿裡雲oss官網貼出的簽名計算方式:

Authorization = "OSS " + AccessKeyId + ":" + Signature
Signature = base64(hmac-sha1(AccessKeySecret,
            VERB + "\n"
            + Content-MD5 + "\n" 
            + Content-Type + "\n" 
            + Date + "\n" 
            + CanonicalizedOSSHeaders
            + CanonicalizedResource))
           

通過計算方法可以看出Authorization是由四部分組成:

1. 字元串

OSS

(注意OSS後面有一個空格)

2. AccessKeyId,也就是oss Bucket的使用者名。可以在OSS控制台 - 對象存儲OSS - 概覽,在頁面的右側即可看到AccessKey選項,點進去可以檢視。

3. 字元串

:

4. Signature簽名,這裡再貼一下阿裡雲oss官網給出的計算說明:

  • AccessKeySecret 表示簽名所需的密鑰
  • VERB表示HTTP 請求的Method,主要有PUT,GET,POST,HEAD,DELETE等
  • \n 表示換行符
  • Content-MD5 表示請求内容資料的MD5值,對消息内容(不包括頭部)計算MD5值獲得128比特位數字,對該數字進行base64編碼而得到。該請求頭可用于消息合法性的檢查(消息内容是否與發送時一緻),如”eB5eJF1ptWaXm4bijSPyxw==”,也可以為空。詳情參看RFC2616 Content-MD5
  • Content-Type 表示請求内容的類型,如”application/octet-stream”,也可以為空
  • Date 表示此次操作的時間,且必須為GMT格式,如”Sun, 22 Nov 2015 08:16:38 GMT”
  • CanonicalizedOSSHeaders 表示以 x-oss- 為字首的http header的字典序排列
  • CanonicalizedResource 表示使用者想要通路的OSS資源

      這裡的前幾項相信大家都可以看懂,隻是後面的CanonicalizedOSSHeaders 、CanonicalizedResource 有些迷惑,不知道具體的規則,真正使用時會發現按照上述計算方式得出的簽名,使用時會被oss的伺服器拒絕,傳回簽名錯誤。當初這裡也困擾了我很長時間,下面就寫一下這裡到底要如何計算。

例子

這裡拿object的put API舉例說明:

  • put檔案的官方api
  • 請求工具Postman
  • 上傳檔案 aa.txt
PUT /ObjectName HTTP/1.1
Content-Length:ContentLength
Content-Type: ContentType
Host: BucketName.oss-cn-hangzhou.aliyuncs.com
Date: GMT Date
Authorization: SignatureValue
           

步驟

1.生成Signature之前的參數

VERB: "post"
Content-MD5: ""  //如果沒有MD5可以為空字元串
Content-Type: "text/plain"
Date: "Tue, 26 Sep 2017 07:10:15 GMT"  //GMT格式時間
CanonicalizedOSSHeaders: ["x-oss-date:Tue, 26 Sep 2017 07:10:15 GMT","x-oss-user-agent:aliyun-sdk-js/4.10.0 Chrome 60.0.3112.113 on Windows 10 64-bit"]
CanonicalizedResource: "/bucket/aa.txt"  //bucket為你的bucket名稱
           

上面的CanonicalizedOSSHeaders實際上是一個數組,第一個元素為x-oss-date,值與Date一樣,後面的x-oss-user-agent是從oss-sdk源碼上拔下來的,可以直覺看出包含了sdk、浏覽器版本、系統版本等資訊。

2.将前面的參數拼接成一個字元串

從Signature的規則中,每個參數後面都要加一個換行符,進而組成一個字元串。我們先将以上參數放在一個數組中。(CanonicalizedOSSHeaders有兩項則在數組中有兩個元素,這裡需要注意)

"PUT"
 ""
 "text/plain"
 "Tue, 26 Sep 2017 07:10:15 GMT"
 "x-oss-date:Tue, 26 Sep 2017 07:10:15 GMT"
 "x-oss-user-agent:aliyun-sdk-js/4.10.0 Chrome 60.0.3112.113 on Windows 10 64-bit"
 "/chengyanzhao/aa.txt"
           

然後使用array的join(‘\n’)方法合并成一個字元串

"PUT

text/plain
Tue,  Sep  :: GMT
x-oss-date:Tue,  Sep  :: GMT
x-oss-user-agent:aliyun-sdk-js/. Chrome . on Windows  -bit
/chengyanzhao/aa.txt"
           

這樣Authorization = “OSS ” + AccessKeyId + “:” + Signature中的計算參數我們就有了,套入base64和hmac-sha1計算方式即可得出Authorization。

3.發送請求

headers

阿裡雲oss - 檔案上傳1 Authorization的計算方式2 修改檔案的中繼資料

body

阿裡雲oss - 檔案上傳1 Authorization的計算方式2 修改檔案的中繼資料

response

阿裡雲oss - 檔案上傳1 Authorization的計算方式2 修改檔案的中繼資料

另外這裡有一個demo,是在阿裡雲論壇上找到的,為了友善學習我在網盤中分享,密碼:9d54。

2 修改檔案的中繼資料

2.1 修改檔案的下載下傳名

首先要了解,控制檔案的下載下傳名,其實就是控制headers中的Content-Disposition。通過修改它的值來實作修改檔案下載下傳名。

修改檔案下載下傳名可分兩種方式:

  1. 上傳時設定
  2. 上傳後設定

這裡使用js-oss-sdk來說明。

1.上傳時設定

阿裡oss提供了多種上傳方式,但每種上傳方法都接受一個options參數,這個參數即可設定檔案的中繼資料。

headers:{
  'Content-Disposition': 'attachment;filename=' + encodeURI(fileName)
}
           

2.上傳後設定

檔案上傳後修改檔案的下載下傳名,其實就是使用阿裡提供的接口修改檔案的中繼資料中的Content-Disposition。

在js-oss-sdk中,使用copy方法設定檔案的中繼資料

// key為oss中檔案的key,也就是在oss控制台中現實的檔案名。
client.copy(key, key, {
  headers:{
    'Content-Disposition': 'attachment;filename=' + encodeURI(fileName)
  }
})
           

2.2 修改其他中繼資料

了解本質,oss的檔案中繼資料資訊都是通過headers傳輸,是以這裡還是通過copy方法,将新的中繼資料放在options參數中,與上面的修改檔案後修改檔案下載下傳名用法相同,這裡就不多贅述。