OSS支援使用者在上傳時指定"x-oss-meta-"字首的header作為自定義header,用于存儲檔案的一些辨別資訊等自定義的資訊,并在下載下傳(GetObject/HeadObject)時作為傳回頭傳回給使用者。但是在某些場景下使用者需要使用非"x-oss-meta-"字首的header作為自定義header,比如使用者的資料原來存儲在自建的儲存設備上,并且自定義了一些header,現在資料遷移到OSS上,需要保持這些header不變,是以OSS提供了相應的機制用來實作這個需求。
這個請求頭的格式如下:
x-oss-persistent-headers: key1:base64_encode(value1),key2:base64_encode(value2)....
其中key1/key2等為自定義的header,value2/value2等為對應自定義header的值,base64_encode指做base64編碼,即将自定義header和對應值的base64編碼作為一個key-value對用冒号連接配接,然後用逗号将所有的key-value對連接配接起來,放在x-oss-persistent-headers這個header中即可。
例子:假如我要自定義兩個header,分别為myheader1/myheader2,值分别為myvalue1/myvalue2,則需要在上傳時指定下面這個頭
x-oss-persistent-headers:myheader1:bXl2YWx1ZTE=,myheader2:bXl2YWx1ZTI=
這種方式适用于PutObject()/CopyObject()/AppendObject()/CompleteMultipartUpload()上傳方式
這個表單域的值格式與上面1所述相同,這種傳入方式适用于PostObject(),即表單上傳
如果使用者通過OSS的鏡像回源功能,也想儲存類似的自定義header,則需要鏡像源站傳回"x-oss-persistent-headers"頭,格式與1所述相同。這種方式适用于鏡像回源。
通過GetObject()/HeadObject()接口,自定義的usermeta會通過傳回頭的方式傳回給使用者,比如上例,就會在回應頭中增加兩個頭
myheader1:myvalue1
myheader2:myvalue2
接上述例子,上傳時的完整的請求如下:
PUT /tmp HTTP/1.1
Host: 067365.oss-cn-hangzhou.aliyuncs.com
Accept-Encoding: identity
Content-Length: 19
User-Agent: aliyun-sdk-python/0.3.7 (Linux/2.6.32-220.23.2.ali1089.el5.x86_64/x86_64;2.7.8)
Date: Wed, 28 Feb 2018 02:03:25 GMT
x-oss-persistent-headers: myheader1:bXl2YWx1ZTE=,myheader2:bXl2YWx1ZTI=
Content-Type: application/octet-stream
Authorization: OSS a1nBNgkzzxcQMf8u:AT2DUCaIh4g9KLxEGmga2K82lf8=
for user meta test
HTTP/1.1 200 OK
Server: AliyunOSS
Content-Length: 0
Connection: keep-alive
x-oss-request-id: 5A960DEDC46757366ADDB10D
ETag: "0F07FE95A928BB5A491AEFD31D6911AA"
x-oss-hash-crc64ecma: 13270199186025944929
Content-MD5: Dwf+lakou1pJGu/THWkRqg==
x-oss-server-time: 103
下載下傳檔案時完整請求和響應如下:
GET /tmp HTTP/1.1
User-Agent: curl/7.15.5 (x86_64-koji-linux-gnu) libcurl/7.15.5 OpenSSL/0.9.8b zlib/1.2.3 libidn/0.6.5
Accept: */*
Date: Wed, 28 Feb 2018 02:24:57 GMT
x-oss-request-id: 5A9612F95C44F0A86ADF3213
Accept-Ranges: bytes
Last-Modified: Wed, 28 Feb 2018 02:03:25 GMT
x-oss-object-type: Normal
x-oss-storage-class: Standard
myheader1: myvalue1
myheader2: myvalue2
x-oss-server-time: 92
1. 通過這種方式指定的自定義header,不能以"x-oss-"為字首,比如可以指定"myheader",但是不能指定"x-oss-myheader"
2. 不能指定HTTP規定的标準頭,比如host/content-md5/origin/range等等
3. 如果上傳時傳入了與指定的自定義header相同的header,則兩個header的值要保持相同。比如通過"x-oss-persistent-headers"指定了myheader,同時在請求頭中單獨傳入了myheader,則兩個header的值要相同
4. 這種方式指定的自定義header也屬于usermeta的範疇,是以也有最多8KB的限制,即所有的usermta總大小不能超過8KB