概述
對(duì)象存儲(chǔ)服務(wù)(Object Storage Service,簡(jiǎn)稱OSS),OSS提供統(tǒng)一存儲(chǔ)的解決方案
方便、快捷的使用方式
提供標(biāo)準(zhǔn)的RESTful API接口涡真、豐富的SDK包、客戶端工具、控制臺(tái)囚企。您可以像使用文件一樣方便地上傳、下載瑞眼、檢索龙宏、管理用于Web網(wǎng)站或者移動(dòng)應(yīng)用的海量數(shù)據(jù)。
不限文件數(shù)量和大小伤疙。您可以根據(jù)所需存儲(chǔ)量無限擴(kuò)展存儲(chǔ)空間银酗,解決了傳統(tǒng)硬件存儲(chǔ)擴(kuò)容問題。
支持流式寫入和讀出掩浙。特別適合視頻等大文件的邊寫邊讀業(yè)務(wù)場(chǎng)景花吟。
支持?jǐn)?shù)據(jù)生命周期管理。您可以自定義將到期數(shù)據(jù)批量刪除或者轉(zhuǎn)入到低成本的歸檔服務(wù)厨姚。
強(qiáng)大衅澈、靈活的安全機(jī)制
靈活的鑒權(quán),授權(quán)機(jī)制谬墙。
提供URL鑒權(quán)和授權(quán)機(jī)制今布,以及白名單、防盜鏈拭抬、主子賬號(hào)功能部默。
提供用戶級(jí)別資源隔離機(jī)制和多集群同步機(jī)制(可選)。
擴(kuò)展服務(wù)
圖片處理:支持jpg造虎、png傅蹂、bmp、gif算凿、webp份蝴、tiff等多種圖片格式的轉(zhuǎn)換,以及縮略圖氓轰、剪裁婚夫、水印、縮放等多種操作署鸡。
音視頻轉(zhuǎn)碼:提供高質(zhì)量案糙、高速并行的音視頻轉(zhuǎn)碼能力限嫌,讓您的音視頻文件輕松應(yīng)對(duì)各種終端設(shè)備。
內(nèi)容加速分發(fā):OSS作為源站时捌,搭配CDN進(jìn)行加速分發(fā)怒医,具有穩(wěn)定、無回源帶寬限制匣椰、性價(jià)比高裆熙、一鍵配置的特點(diǎn)。
典型應(yīng)用場(chǎng)景
1.云端數(shù)據(jù)處理
上傳文件到OSS后禽笑,可以使用應(yīng)用插件實(shí)現(xiàn)圖片處理實(shí)現(xiàn)云端數(shù)據(jù)處理入录。
2.qisp申報(bào)服務(wù)
企業(yè)上傳excel到oss服務(wù)器,通過excel轉(zhuǎn)json實(shí)現(xiàn)預(yù)覽,讀取,簡(jiǎn)化excel操作
3.mle移動(dòng)查驗(yàn)平臺(tái)
平板通拍照上傳實(shí)現(xiàn)佳镜,實(shí)現(xiàn)多系統(tǒng)圖片共享
4.nqp口岸云服務(wù)平臺(tái)
手機(jī)端拍照上傳,微信端圖片上傳備份
對(duì)象列表
Bucket 存儲(chǔ)空間
Object 對(duì)象
ObjectPlugin 擴(kuò)展插件
Acl訪問控制
目錄
api概覽
Bucket操作
列出Bucket
Get/get
創(chuàng)建Bucket
Post/{bucketName}
獲取Bucket
Get/{buckName}
刪除Bucket
Delete/{buckName}
Object的操作
上傳Object
Put/{buckName}/{文件名}
獲取Object
Get/{bucketName}/{文件名}
eg: http://dev.xxx.com/oss/nqp/images|tr@jpg
ObjectPlugin擴(kuò)展插件
- 圖片縮放處理+背景填充
/{bucketName}{文件名}?size=100w_100h_4e_100-0-0bgc
- 圖片水印處理
/{bucketName}{文件名}?watermark=1&text=base64(水印文字)
- excel轉(zhuǎn)json輸出
/{bucketName}{文件名}?export=json&exportId={導(dǎo)出配置id}
- 輸出pdf
/{bucketName}{文件名}?export=pdf
- 在線預(yù)覽[pdf,xls,xlsx,word]
/{bucketName}{文件名}?preview=pdf
bucket
POST Bucket
創(chuàng)建Bucket
請(qǐng)求語法
POST / HTTP/1.1
url: Post /{bucketName}
body:{擴(kuò)展屬性}
請(qǐng)求元素(Request Elements)
名稱 | 描述 |
---|---|
bucketName | 存儲(chǔ)空間名稱 |
細(xì)節(jié)分析
- bucketName名稱規(guī)范
1.1 只能包含小寫字母僚稿,數(shù)字和短橫線
1.2 必須以小寫字母和數(shù)字開頭和結(jié)尾
1.3 bucketName的長(zhǎng)度限制在3-63之間
1.4 不能使用保留關(guān)鍵字 admin,local,config,master
實(shí)現(xiàn)分析
- MongolDB實(shí)現(xiàn)
1.1.新建bucket將創(chuàng)建一個(gè)數(shù)據(jù)庫
1.2.bucket中信息存儲(chǔ)于master庫中 - SqlServer實(shí)現(xiàn)
2.1 多個(gè)空間實(shí)現(xiàn)在同一個(gè)數(shù)據(jù)庫
2.2 bucket存儲(chǔ)在一張表中
示例
請(qǐng)求示例:
POST / HTTP/1.1
url: Post/{bucketName}
body:{擴(kuò)展屬性}
返回示例:
200
列出Bucket
Get /get
獲取Bucket
Get /{buckName}
刪除Bucket
Delete/{buckName}
PUT Object
上傳對(duì)象
請(qǐng)求語法
PUT / HTTP/1.1
url:/{bucketName}/object
請(qǐng)求Header(Request Elements)
名稱 | 描述 |
---|---|
bucketName | 存儲(chǔ)空間名稱 |
Cache-Control | 指定該Object被下載時(shí)的網(wǎng)頁的緩存行為;更詳細(xì)描述請(qǐng)參照RFC2616蟀伸。 類型:字符串 默認(rèn)值:無 |
Content-Disposition | 指定該Object被下載時(shí)的名稱蚀同;更詳細(xì)描述請(qǐng)參照RFC2616。 類型:字符串 默認(rèn)值:無 |
Content-Encoding | 指定該Object被下載時(shí)的內(nèi)容編碼格式啊掏;更詳細(xì)描述請(qǐng)參照RFC2616蠢络。 類型:字符串 默認(rèn)值:無 |
Content-MD5 | 根據(jù)協(xié)議RFC 1864對(duì)消息內(nèi)容(不包括頭部)計(jì)算MD5值獲得128比特位數(shù)字,對(duì)該數(shù)字進(jìn)行base64編碼為一個(gè)消息的Content-MD5值迟蜜。該請(qǐng)求頭可用于消息合法性的檢查(消息內(nèi)容是否與發(fā)送時(shí)一致)刹孔。雖然該請(qǐng)求頭是可選項(xiàng),OSS建議用戶使用該請(qǐng)求頭進(jìn)行端到端檢查娜睛。 類型:字符串 默認(rèn)值:無 限制:無 |
Expires | 過期時(shí)間髓霞;更詳細(xì)描述請(qǐng)參照RFC2616。 類型:字符串 默認(rèn)值:無 注意:OSS不會(huì)對(duì)這個(gè)值進(jìn)行限制和驗(yàn)證 |
x-oss-object-acl | 指定oss創(chuàng)建object時(shí)的訪問權(quán)限畦戒。 類型:字符串 合法值:public-read方库,private,public-read-write |
細(xì)節(jié)分析
- 如果用戶上傳了Content-MD5請(qǐng)求頭障斋,OSS會(huì)計(jì)算body的Content-MD5并檢查一致性纵潦,如果不一致,將返回InvalidDigest錯(cuò)誤碼垃环。
- 如果請(qǐng)求頭中的“Content-Length”值小于實(shí)際請(qǐng)求體(body)中傳輸?shù)臄?shù)據(jù)長(zhǎng)度邀层,OSS仍將成功創(chuàng)建文件;但Object大小只等于“Content-Length”中定義的大小晴裹,其他數(shù)據(jù)將被丟棄被济。
- 如果試圖添加的Object的同名文件已經(jīng)存在救赐,并且有訪問權(quán)限涧团。新添加的文件將覆蓋原來的文件只磷,成功返回200 OK。
- 如果在PutObject的時(shí)候泌绣,攜帶以x-oss-meta-為前綴的參數(shù)钮追,則視為user meta,比如x-oss-meta-location阿迈。一個(gè)Object可以有多個(gè)類似的參數(shù)元媚,但所有的user meta總大小不能超過8k。
- 如果Head中沒有加入Content length參數(shù)苗沧,會(huì)返回411 Length Required錯(cuò)誤刊棕。錯(cuò)誤碼:MissingContentLength。
- 如果設(shè)定了長(zhǎng)度待逞,但是沒有發(fā)送消息Body甥角,或者發(fā)送的body大小小于給定大小,服務(wù)器會(huì)一直等待识樱,直到time out嗤无,返回400 Bad Request消息。錯(cuò)誤碼:RequestTimeout怜庸。
- 如果試圖添加的Object所在的Bucket不存在当犯,返回404 Not Found錯(cuò)誤。錯(cuò)誤碼:NoSuchBucket割疾。
- 如果試圖添加的Object所在的Bucket沒有訪問權(quán)限嚎卫,返回403 Forbidden錯(cuò)誤。錯(cuò)誤碼:AccessDenied杈曲。
- 如果添加文件長(zhǎng)度超過5G驰凛,返回錯(cuò)誤消息400 Bad Request。錯(cuò)誤碼:InvalidArgument担扑。
- 如果傳入的Object key長(zhǎng)度大于1023字節(jié)恰响,返回400 Bad Request。錯(cuò)誤碼:InvalidObjectName涌献。
- PUT一個(gè)Object的時(shí)候胚宦,OSS支持5個(gè) HTTP RFC2616協(xié)議規(guī)定的Header 字段:Cache-Control、Expires燕垃、Content-Encoding枢劝、Content-Disposition、Content-Type卜壕。如果上傳Object時(shí)設(shè)置了這些Header您旁,則這個(gè)Object被下載時(shí),相應(yīng)的Header值會(huì)被自動(dòng)設(shè)置成上傳時(shí)的值轴捎。
- 如果上傳Object時(shí)指定了x-oss-server-side-encryption Header鹤盒,則必須設(shè)置其值為AES256蚕脏,否則會(huì)返回400和相應(yīng)錯(cuò)誤提示:InvalidEncryptionAlgorithmError。指定該Header后侦锯,在響應(yīng)頭中也會(huì)返回該Header驼鞭,OSS會(huì)對(duì)上傳的Object進(jìn)行加密編碼存儲(chǔ),當(dāng)這個(gè)Object被下載時(shí)尺碰,響應(yīng)頭中會(huì)包含x-oss-server-side-encryption挣棕,值被設(shè)置成該Object的加密算法。
實(shí)現(xiàn)分析
1.MongoDB實(shí)現(xiàn)
1.1
常見問題
Content-MD5計(jì)算方式錯(cuò)誤
示例
請(qǐng)求示例:
POST /oss.jpg HTTP/1.1 Host: eas.nbeport.com Cache-control: no-cache Expires: Fri, 28 Feb 2012 05:38:42 GMT Content-Encoding: utf-8 Content-Disposition: attachment; ObjectName=oss_download.jpg Date: Fri, 24 Feb 2012 06:03:28 GMT Content-Type: image/jpg Content-Length: 344606 Authorization: sos-token [344606 bytes of object data]
返回示例:
HTTP/1.1 200 OK Server: dev .xxx.com/oss Date: Sat, 21 Nov 2015 18:52:34 GMT Content-Length: 0 Connection: keep-alive x-oss-request-id: 5650BD72207FB30443962F9A x-oss-bucket-version: 1418321259 ETag: "A797938C31D59EDD08D86188F6D5B872" { id:A797938C31D59EDD08D861, fileName:'/images/oss_download.jpg', backName:'nqp', }
Get Object
獲取對(duì)象
請(qǐng)求語法
get / HTTP/1.1
- 通過文件名獲取 get /{bucketName}/{objectName}
url:http://dev.xxx.com/oss/{backetName}/{objectName}
- 通過id獲取
url:http://dev.xxx.com/oss/object/{id}
請(qǐng)求參數(shù)(Request Elements)
名稱 | 描述 |
---|---|
bucketName | 存儲(chǔ)空間名稱 |
id | 由oss系統(tǒng)生居guid |
objectName | 對(duì)象/文件名亲桥,規(guī)則 {bucket}/{filename} images\\tr@jpg 目錄使用表示.用@表示 http://dev.xxx.com/oss/nqp/images\\tr@jpg |
細(xì)節(jié)分析
示例
請(qǐng)求示例:
PUT /oss.jpg HTTP/1.1 Host: oss-example.oss-cn-hangzhou.aliyuncs.com Cache-control: no-cache Expires: Fri, 28 Feb 2012 05:38:42 GMT Content-Encoding: utf-8 Content-Disposition: attachment;filename=oss_download.jpg Date: Fri, 24 Feb 2012 06:03:28 GMT Content-Type: image/jpg Content-Length: 344606 Authorization: sos-token [344606 bytes of object data]
返回示例:
HTTP/1.1 200 OK Server: AliyunOSS Date: Sat, 21 Nov 2015 18:52:34 GMT Content-Length: 0 Connection: keep-alive x-oss-request-id: 5650BD72207FB30443962F9A x-oss-bucket-version: 1418321259 ETag: "A797938C31D59EDD08D86188F6D5B872" /{bucketName}
訪問控制
在Header中包含簽名
用戶可以在HTTP請(qǐng)求中增加Authorization(授權(quán))的Header來包含簽名(Signature)信息洛心,表明這個(gè)消息已被授權(quán)。
Authorization字段計(jì)算的方法
"Authorization: OSS "+AccessKeyId+":"+Signature
Signature=base64(hmac-sha1(AccessKeySecret,
VERB+ "\n”
+Content-MD5+ "\n”
+Content-Type+ "\n”
+Date))
+CanonicalizedOSSHeaders
+CanonicalizedResource)))
- AccessKeySecret表示簽名所需的秘鑰
- VERB表示HTTP 請(qǐng)求的Method题篷,主要有PUT皂甘,GET,POST悼凑,HEAD偿枕,DELETE等“\n”表示換行符
- Content-MD5表示請(qǐng)求內(nèi)容數(shù)據(jù)的MD5值,對(duì)消息內(nèi)容(不包括頭部)計(jì)算MD5值獲得128比特位數(shù)字户辫,對(duì)該數(shù)字進(jìn)行base64編碼而得到渐夸。該請(qǐng)求頭可用于消息合法性的檢查(消息內(nèi)容是否與發(fā)送時(shí)一致),如”eB5eJF1ptWaXm4bijSPyxw==”渔欢,也可以為空墓塌。詳情參看RFC2616 Content-MD5
- Content-Type表示請(qǐng)求內(nèi)容的類型,如”application/octet-stream”奥额,也可以為空
- Date表示此次操作的時(shí)間苫幢,且必須為HTTP1.1中支持的GMT格式,如”Sun, 22 Nov 2015 08:16:38 GMT”
6.DATE時(shí)間和OSS服務(wù)器的時(shí)間差正負(fù)15分鐘以上垫挨,OSS服務(wù)器將拒絕該服務(wù)韩肝,并返回HTTP 403錯(cuò)誤。
7.CanonicalizedOSSHeaders表示以“x-oss-”為前綴的http header的組合
構(gòu)建CanonicalizedOSSHeaders的方法
所有以“x-oss-”為前綴的HTTP Header被稱為CanonicalizedOSSHeaders九榔。它的構(gòu)建方法如下:
將所有以“x-oss-”為前綴的HTTP請(qǐng)求頭的名字轉(zhuǎn)換成小寫字母哀峻。如’X-OSS-Meta-userName:hz24’轉(zhuǎn)換成’x-oss-meta-username:hz24’。刪除請(qǐng)求頭和內(nèi)容之間分隔符兩端出現(xiàn)的任何空格哲泊。如’x-oss-meta-username:hz24’轉(zhuǎn)換成:’x-oss-meta-name:hz24’剩蟀。將每一個(gè)頭和內(nèi)容用”\n”分隔符分隔拼成最后的CanonicalizedOSSHeaders。
8.CanonicalizedResource 表示想要訪問的OSS資源描述
計(jì)算簽名頭規(guī)則
1.簽名的字符串必須為UTF-8格式切威。含有中文字符的簽名字符串必須先進(jìn)行UTF-8編碼育特,再與AccessKeySecret計(jì)算最終簽名。
2.簽名的方法用RFC 2104中定義的HMAC-SHA1方法先朦,其中Key為AccessKeySecret缰冤。
3.Content-Type和Content-MD5在請(qǐng)求中不是必須的槽袄,但是如果請(qǐng)求需要簽名驗(yàn)證,空值的話以換行符“\n”代替锋谐。
4.在所有非HTTP標(biāo)準(zhǔn)定義的header中,只有以“x-oss-”開頭的header截酷,需要加入簽名字符串涮拗;其他非HTTP標(biāo)準(zhǔn)header將被OSS忽略(如上例中的x-oss-magic是需要加入簽名字符串的)。
5.以“x-oss-”開頭的header在簽名驗(yàn)證前需要符合以下規(guī)范:
header的名字需要變成小寫迂苛。
header按字典序自小到大排序三热。
6.分割header name和value的冒號(hào)前后不能有空格。
每個(gè)Header之后都有一個(gè)換行符“\n”三幻,如果沒有Header就漾,
構(gòu)建CanonicalizedOSSHeaders的方法
用戶發(fā)送請(qǐng)求中想訪問的OSS目標(biāo)資源被稱為CanonicalizedResource。它的構(gòu)建方法如下:
將CanonicalizedResource置成空字符串(“”)念搬;
放入要訪問的OSS資源:“ /BucketName/ObjectName”(無ObjectName則CanonicalizedResource為”/BucketName/“抑堡,如果同時(shí)也沒有BucketName則為“/”)
如果請(qǐng)求的資源包括子資源(sub-resource) ,那么將所有的子資源按照字典序朗徊,從小到大排列并以&為分隔符生成子資源字符串首妖。在CanonicalizedResource字符串尾添加“?”和子資源字符串爷恳。此時(shí)的CanonicalizedResource例子如:/BucketName/ObjectName?acl &uploadId=UploadId如果用戶請(qǐng)求在查詢字符串(query string)中指定了要重寫(override)返回請(qǐng)求的header 有缆,那么將這些查詢字符串及其請(qǐng)求值按照字典序,從小到大排列温亲,以&為分隔符棚壁,按參數(shù)的字典序添加到CanonicalizedResource中。此時(shí)的CanonicalizedResource例子:/BucketName/ObjectName?acl&response-content-type=ContentType & uploadId =UploadId栈虚。OSS支持的override請(qǐng)求頭參考Get Object
OSS目前支持的子資源(sub-resource)包括:acl袖外,uploadId,partNumber魂务,uploads在刺,logging,website头镊,location蚣驼,lifecycle,referer相艇,cors颖杏,delete,append坛芽,position留储,bucketInfo
在URL中包含簽名
除了使用Authorization Head翼抠,用戶還可以在URL中加入簽名信息,這樣用戶就可以把該URL轉(zhuǎn)給第三方實(shí)現(xiàn)授權(quán)訪問获讳。
實(shí)現(xiàn)方式
URL中包含簽名示例:
http://dev.nbxxx.com/oss/nqp|images|tr#jpg? AccessKeyId=44CF9590006BF252F707&expires=1141889120&Signature=vjbyPxybdZaNmGa%2ByT272YEAiv4%3D
在URL中實(shí)現(xiàn)簽名阴颖,必須至少包含Signature,Expires丐膝,AccessKeyId三個(gè)參數(shù)量愧。
- Expires這個(gè)參數(shù)的值是一個(gè)UNIX時(shí)間(自UTC時(shí)間1970年1月1號(hào)開始的秒數(shù),詳見wiki)帅矗,用于標(biāo)識(shí)該URL的超時(shí)時(shí)間偎肃。如果OSS接收到這個(gè)URL請(qǐng)求的時(shí)候晚于簽名中包含的Expires參數(shù)時(shí),則返回請(qǐng)求超時(shí)的錯(cuò)誤碼浑此。例如:當(dāng)前時(shí)間是1141889060累颂,開發(fā)者希望創(chuàng)建一個(gè)60秒后自動(dòng)失效的URL,則可以設(shè)置Expires時(shí)間為1141889120凛俱。
- AccessKeyId即AccessKeyId紊馏。
Signature表示簽名信息。所有的OSS支持的請(qǐng)求和各種Header參數(shù)蒲犬,在URL中進(jìn)行簽名的算法和在Header中包含簽名的算法基本一樣瘦棋。
Signature = urlencode(base64(hmac-sha1(AccessKeySecret,
VERB+"\n"
+CONTENT-MD5+"\n"
+CONTENT-TYPE+"\n"
+EXPIRES+"\n"
+CanonicalizedOSSHeaders
+CanonicalizedResource)))
- 其中,與header中包含簽名相比主要區(qū)別如下:
3.1通過URL包含簽名時(shí)暖哨,之前的Date參數(shù)換成Expires參數(shù)赌朋。
3.2不支持同時(shí)在URL和Head中包含簽名。
3.3如果傳入的Signature篇裁,Expires沛慢,OSSAccessKeyId出現(xiàn)不止一次,以第一次為準(zhǔn)达布。
3.4請(qǐng)求先驗(yàn)證請(qǐng)求時(shí)間是否晚于Expires時(shí)間团甲,然后再驗(yàn)證簽名。
將簽名字符串放到url時(shí)黍聂,注意要對(duì)url進(jìn)行urlencode
4.CanonicalizedOSSHeaders表示以“x-oss-”為前綴的http header的組合
5.CanonicalizedResource 表示用戶想要訪問的OSS資源
6.CanonicalizedOSSHeaders就設(shè)置為空躺苦。
下一階段任務(wù)
- OSS應(yīng)用推廣
- MongoDB存儲(chǔ)優(yōu)化
- 對(duì)象插件擴(kuò)展