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