阿里云存储OSS之九大使用技巧
http://www.biphp.com/cloud-computing/%E9%98%BF%E9%87%8C%E4%BA%91%E5%AD%98%E5%82%A8oss%E4%B9%8B%E4%B9%9D%E5%A4%A7%E4%BD%BF%E7%94%A8%E6%8A%80%E5%B7%A7/
阿里云內(nèi)部人員撰寫(xiě)的阿里云存儲(chǔ)OSS使用教程,對(duì)使用OSS的同學(xué)們很有幫助!
阿里云存儲(chǔ)OSS使用技巧之一:在OSS上讀寫(xiě)文件
從你的代碼中,把fopen()、fclose()這類的函數(shù)刪掉吧!取而代之的是RESTful風(fēng)格的HTTP請(qǐng)求:寫(xiě)文件是PUT;讀文件是GET;獲取文件屬性是HEAD;刪除文件是DELETE。
在搭建好的OSS Python開(kāi)發(fā)環(huán)境下,直接用上步聲明的my_store對(duì)象創(chuàng)建并寫(xiě)入一個(gè)新文件(OSS稱之為Object)的代碼如下:
res = my_store.put_object(bucket_name, object_name, input_content, content_type)
上例中,content_type可以根據(jù)需求,填入HTTP協(xié)議中規(guī)定的某一種文件類型。如JPG圖片使用“image/jpeg”,MP3文件 使用“audio/mpeg”,具體定義請(qǐng)參考RFC 2616。選擇正確的content-type,可以讓其他互聯(lián)網(wǎng)應(yīng)用直接正確地使用OSS上的文件。
讀取一個(gè)已存在文件的代碼如下:
res = my_store.get_object (bucket_name, object_name)
獲取文件屬性的代碼如下:
res = my_store.head_object (bucket_name, object_name)
刪除一個(gè)文件的代碼如下:
res = my_store.delete_object (bucket_name, object_name)
通過(guò)上面列舉的這四個(gè)簡(jiǎn)單的函數(shù),你就可以輕松地將建立在傳統(tǒng)文件系統(tǒng)上的應(yīng)用移植到OSS這個(gè)云存儲(chǔ)平臺(tái)上來(lái)了。
阿里云存儲(chǔ)OSS使用技巧之二:通過(guò)簽名URL防盜鏈
由于OSS有著非常優(yōu)秀的網(wǎng)絡(luò)帶寬質(zhì)量,很多朋友希望基于OSS開(kāi)發(fā)圖片、音樂(lè)、視頻等網(wǎng)站和應(yīng)用。但如何有效地防盜鏈?zhǔn)莻€(gè)讓人頭疼的問(wèn)題。這里介紹一個(gè)簡(jiǎn)單且安全的方法:通過(guò)簽名URL防盜鏈。
首先,確認(rèn)自己的bucket權(quán)限是private,即這個(gè)bucket的所有請(qǐng)求必須在簽名認(rèn)證通過(guò)后才被認(rèn)為是合法的。然后根據(jù)操作類型、要訪問(wèn)的
bucket、要訪問(wèn)的object以及超時(shí)時(shí)間,動(dòng)態(tài)地生成一個(gè)經(jīng)過(guò)簽名的URL。通過(guò)這個(gè)簽名URL,你授權(quán)的用戶就可以在該簽名URL過(guò)期時(shí)間前執(zhí)
行相應(yīng)的操作。
簽名的python代碼如下:
url = my_store.sign_url (method, bucket_name, object_name,timeout = 60)
其中method可以是PUT,GET,HEAD,DELETE中的任意一種;最后一個(gè)參數(shù)“timeout”是超時(shí)的時(shí)間,單位是秒。一個(gè)通過(guò)上面python方法,計(jì)算得到的簽名URL為:
http://storage.aliyun.com/sharedata/lingyun.jpg?OSSAccessKeyId=y6h7nbcothehv cp7jlnwmrw9&Expires=1335084740&Signature=LZeqnHSo5WkDNWKffKDgQBXR6fY=
通過(guò)這種動(dòng)態(tài)計(jì)算簽名URL的方法,可以有效地保護(hù)放在OSS上的數(shù)據(jù),防止被其他人盜鏈。
阿里云存儲(chǔ)OSS使用技巧之三:滿足特定條件時(shí)才傳輸數(shù)據(jù)
IMS(If-Modified-Since)參數(shù)是HTTP協(xié)議中,經(jīng)常被用到的一個(gè)參數(shù)。它的含義是:通過(guò)這個(gè)時(shí)間戳參數(shù),服務(wù)器端可以判斷客 戶端的數(shù)據(jù)是否是最新的;如果不是最新的,則返回服務(wù)器端的數(shù)據(jù);如果是最新的,則返回 304 告訴客戶端其本地 cache 的頁(yè)面是最新的,于是客戶端就可以直接從本地加載數(shù)據(jù)了。這樣在網(wǎng)絡(luò)上傳輸?shù)臄?shù)據(jù)量就會(huì)大大減少,同時(shí)也減輕了服務(wù)器的負(fù)擔(dān)。
包括IMS在內(nèi),OSS共支持四種條件傳輸參數(shù)。只有Object的屬性滿足客戶端給出的條件時(shí),OSS才傳輸Object的數(shù)據(jù)。這四個(gè)參數(shù)是:
l If-Modified-Since
l If-Unmodified-Since
l If-Match
l If-None-Match
If-Unmodified-Since的含義和If-Modified-Since正好相反:如果內(nèi)容沒(méi)更新,則返回?cái)?shù)據(jù);否則返回HTTP狀態(tài)
碼304。If-Unmodified-Since和If-Modified-Since這兩個(gè)參數(shù)可以一起使用,以指定一個(gè)時(shí)間窗口。例如:
headers = {}
headers[‘“If-Modified-Since’] = “Sun, 22 Apr 2012 09:06:23 GMT”
headers[‘“If-Unmodified-Since’] = “Sun, 22 Apr 2012 09:16:23 GMT”
res = my_store.get_object (bucket_name, object_name, headers)
If-Match、If-None-Match這對(duì)參數(shù)與If-Unmodified-Since、If-Modified-Since參數(shù)的含義 類似,只是參數(shù)不是時(shí)間戳,而是內(nèi)容的MD5值。利用好這四個(gè)參數(shù),可以節(jié)省大量的流量,也就是可以節(jié)省很多money。
阿里云存儲(chǔ)OSS使用技巧之四:OSS上如何實(shí)現(xiàn)文件夾功能
許多終端用戶習(xí)慣了文件夾這個(gè)概念,而較難適應(yīng)只有bucket和object的云存儲(chǔ)邏輯。但我們可以基于OSS從邏輯上實(shí)現(xiàn)文件夾功能。
首先,我們可以按照慣例,認(rèn)為所有以“/”[1]結(jié)尾的Object都是一個(gè)文件夾。例如,用戶認(rèn)為:“folder”是一個(gè)文件;“folder /”是一個(gè)文件夾;而“folder/file.txt”是一個(gè)放在folder文件夾內(nèi)名為file.txt的文件。在云存儲(chǔ)OSS上,“folder /”、“folder”和“folder/file.txt”其實(shí)都是object。
當(dāng)用戶需要查詢一個(gè)文件夾下的文件時(shí),我們就需要巧妙地通過(guò)List Object(Get Bucket)接口的四個(gè)參數(shù):prefix,marker,delimiter和max-keys來(lái)實(shí)現(xiàn)。
例如,我們?cè)贠SS上名為”mydata”的bucket內(nèi)有如下幾個(gè)文件:
lingyun.doc folder/ folder/file1.txt folder/file2.txt folder/file3.txt folder/image/ folder/image/test.jpg
如果認(rèn)為這個(gè)bucket是一個(gè)傳統(tǒng)文件系統(tǒng)的話,當(dāng)用戶進(jìn)入該bucket,應(yīng)該只看到一個(gè)名為“lingyun.doc”的文件和一個(gè)名為 “folder/”的文件夾。為了獲得這樣的效果,我們將List Object請(qǐng)求的delimiter參數(shù)設(shè)為“/”即可,代碼如下:
res = my_store.list_objects("mydata", delimiter='/')
OSS收到這個(gè)請(qǐng)求后,會(huì)返回一個(gè)XML格式的消息,中間記錄了這個(gè)bucket內(nèi)有一個(gè)key為“lingyun.doc”的文件,以及一個(gè)名為 “folder”的common prefix,分別對(duì)應(yīng)于文件和文件夾。當(dāng)繼續(xù)想查看文件夾”folder”內(nèi)的文件列表時(shí),可以將prefix參數(shù)設(shè)為“folder/”,代碼如下:
res = my_store.list_objects("mydata", prefix=’folder/’, delimiter='/')
執(zhí)行后,我們就可以知道文件夾“folder”內(nèi),有三個(gè)文件:“file1.txt”,“file2.txt”,“file3.txt”和一個(gè)子文件夾:“image/”。
list
objects命令的另一個(gè)參數(shù)是max-keys,它定義了在一次請(qǐng)求內(nèi)OSS返回文件和文件夾最大的數(shù)目,默認(rèn)值是100,最大可以設(shè)成1000。但
如果一個(gè)文件夾內(nèi)有超過(guò)1000個(gè)文件怎么辦?這時(shí),可以利用list
objects的最后一個(gè)參數(shù)——marker。這個(gè)參數(shù)告訴OSS從指定的文件開(kāi)始,按照字典序
查其后面的文件。示例代碼為:
res = my_store.list_objects("mydata", prefix='folder/', marker='folder/file1.txt',
delimiter='/', maxkeys='1')
這時(shí),OSS只會(huì)返回一個(gè)查詢結(jié)果:“folder/file2.txt”。利用好這四個(gè)參數(shù),你會(huì)發(fā)現(xiàn)做個(gè)類似于DropBox[2]的應(yīng)用是如此的簡(jiǎn)單。
阿里云OSS使用技巧之五:實(shí)現(xiàn)Object斷點(diǎn)下載和并發(fā)下載
從互聯(lián)網(wǎng)上下載數(shù)據(jù)時(shí),支持?jǐn)帱c(diǎn)下載是一項(xiàng)非常基本的功能。其原理很簡(jiǎn)單,就是記住上次接受數(shù)據(jù)的位置,然后要求服務(wù)器從上次斷點(diǎn)的地方開(kāi)始將余下 的部分傳輸過(guò)來(lái)。下載OSS上的Object時(shí),可以采用HTTP請(qǐng)求中通用的Range這一header,來(lái)完成這個(gè)功能。例如:
獲取一個(gè)文件的頭5個(gè)字節(jié)的請(qǐng)求代碼如下:
Headers = {}
headers['range'] = "bytes=0-4"
res = my_store.get_object (bucket_name, object_name, headers)
獲取一個(gè)文件中間3KB字節(jié)數(shù)據(jù)的請(qǐng)求代碼如下:
Headers = {}
headers['range'] = "bytes=1024-4095"
res = my_store.get_object (bucket_name, object_name, headers)
知道了如何使用range來(lái)隨機(jī)讀一個(gè)object后,實(shí)現(xiàn)并發(fā)下載就輕而易舉了。只要將要下載的object分成若干份,然后開(kāi)多個(gè)線程,每個(gè)線程下載其中的一塊。在所有塊都下載完成后,整個(gè)文件就下載完成了。
注意:按照HTTP協(xié)議,如果用戶的請(qǐng)求中含有range字段,則服務(wù)器返回的HTTP狀態(tài)碼為206 (Partial Content 客戶發(fā)送了一個(gè)帶有Range頭的GET請(qǐng)求,服務(wù)器完成了它)。
阿里云存儲(chǔ)OSS使用技巧之六:實(shí)現(xiàn)大文件并發(fā)上傳
由于OSS是一個(gè)互聯(lián)網(wǎng)服務(wù),用戶終端很難長(zhǎng)時(shí)間保證和OSS之間的TCP連接。所以在上傳一個(gè)大文件時(shí)會(huì)經(jīng)常發(fā)生請(qǐng)求鏈接被斷開(kāi)的情況。
這時(shí)候就可以采用OSS的multipart Upload模式。
Multipart Upload模式的原理是將一個(gè)較大的文件,在客戶端拆成多個(gè)適合上傳的小片(Part),然后分別上傳至OSS服務(wù)器端,最后在服務(wù)器端組合成一個(gè)大文件。由于每個(gè)小片是獨(dú)立上傳的,它們之間沒(méi)有任何的關(guān)聯(lián),所以利用這種模式就可以做到并發(fā)上傳。
雖然原理看起來(lái)很麻煩,但是如果使用OSS提供的SDK的話,只要一行命令就搞定了并發(fā)上傳:
res = my_store.multi_upload_file(bucket_name, object_name,thread_num = 10)
具體實(shí)現(xiàn)細(xì)節(jié)請(qǐng)參考OSS API開(kāi)發(fā)文檔和SDK內(nèi)部的實(shí)現(xiàn)邏輯,有興趣的同學(xué)可以按照自己特定的需求自己實(shí)現(xiàn)一下。
阿里云OSS使用技巧之七:刪除一個(gè)有大量Object的bucket
有一天,也許你只是看著自己的一個(gè)bucket不爽,想刪除它。但OSS服務(wù)出于保護(hù)數(shù)據(jù)的考慮會(huì)溫柔地通知你:這個(gè)bucket里面還有數(shù)據(jù),不 能刪除它。打開(kāi)這個(gè)bucket一看,成千上萬(wàn)的文件在那里等著你去刪。一個(gè)一個(gè)刪,肯定太stupid了。這里教你一個(gè)小方法:先獲取Object列 表,再使用批量刪除接口。在Python的SDK中已經(jīng)封裝好了與之對(duì)應(yīng)的接口:
object_list = []
while true:
object_list = my_store.list_objects(bucket_name)
if len(object_list) != 0:
my_store.batch_delete_objects(bucket_name, object_list)
else:
break
這樣,刪除幾萬(wàn)個(gè)文件,也就是幾十個(gè)請(qǐng)求的事情,不但節(jié)省了請(qǐng)求次數(shù),更為我們節(jié)省了大量的寶貴時(shí)間。
阿里云OSS使用技巧之八:為Object添加自定義的Header
很多情況下,我們希望對(duì)文件的META屬性中放入一些自定義的信息數(shù)據(jù)。例如,一張照片的拍攝時(shí)間;一篇文章的作者;一首歌曲的專輯名;甚至是一個(gè)專利的專利號(hào)。這樣,我們?cè)诓榭次募腗ETA屬性時(shí),就可以獲取這些自定義的信息數(shù)據(jù),而不必將整個(gè)文件下載下來(lái)。
在使用OSS時(shí),可以通過(guò)在PutObject的時(shí)候把自定義的信息數(shù)據(jù)放在以x-oss-meta-為前綴的參數(shù)中。OSS將把這些參數(shù)視為用戶自定義的meta數(shù)據(jù)。添加x-oss-meta-author的實(shí)現(xiàn)代碼為:
headers = {}
headers[‘“x-oss-meta-author’] = obama
res = my_store.put_object (bucket_name, object_name,haders)
在你獲取這個(gè)object的時(shí)候,你將收到如下的HTTP返回值:
HTTP/1.1 200 OK x-oss-request-id: 3a89276f-2e2d-7965-3ff9-51c875b99c41 Date: Fri, 24 Feb 2012 06:38:30 GMT Last-Modified: Fri, 24 Feb 2012 06:07:48 GMT ETag: "5B3C1A2E053D763E1B002CC607C5A0FE " Content-Type: image/jpg Content-Length: 344606 X-oss-meta-author:obama Server: AliyunOSS [344606 bytes of object data]
阿里云OSS使用技巧之九:在OSS上調(diào)試自己的代碼
大家在用OSS開(kāi)發(fā)時(shí),如果發(fā)送了非法或者不符合規(guī)則的HTTP請(qǐng)求,OSS會(huì)返回錯(cuò)誤碼和相應(yīng)的信息來(lái)幫助開(kāi)發(fā)者發(fā)現(xiàn)和定位問(wèn)題。OSS對(duì)于所有 HTTP返回碼不是2XX的請(qǐng)求,都會(huì)返回一個(gè)XML結(jié)構(gòu)的消息體,里面詳細(xì)記錄了無(wú)法執(zhí)行用戶請(qǐng)求的原因。例如,如果你嘗試訪問(wèn)一個(gè)你沒(méi)有訪問(wèn)權(quán)限的 object,那么OSS會(huì)返回給你403 Forbidden的HTTP錯(cuò)誤碼,以及一個(gè)如下的XML格式的消息體:
<?xml version="1.0" ?>
<Error>
<code data-linenums="true"Code>
AccessDenied
</code>
<Message>
AccessDenied
</Message>
<RequestId>
17baec8b-1a0e-8dad-4a6e-343b4d8450dc
</RequestId>
<HostId>
storage.aliyun.com
</HostId>
</Error>
其中上例中的“RequestId”字段是唯一標(biāo)識(shí)該次請(qǐng)求的UUID;當(dāng)你無(wú)法解決問(wèn)題時(shí),可以憑這個(gè)RequestId來(lái)請(qǐng)求OSS開(kāi)發(fā)工程師的幫助。
后記:
通過(guò)上述OSS開(kāi)發(fā)小技巧的介紹,相信大家一定對(duì)OSS這個(gè)云存儲(chǔ)服務(wù)有了更深刻的理解。俗話說(shuō)“高手在民間”,祝大家可以在此基礎(chǔ)上開(kāi)發(fā)出類似DropBox、DrawSomething、Instagram等成功應(yīng)用。
總結(jié)
以上是生活随笔為你收集整理的阿里云存储OSS之九大使用技巧的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 鱼子酱怎么吃(鱼子酱如何配菜)
- 下一篇: 安慰死者家属的话(安慰去世人家属的暖心话