阿里雲存儲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/

 

阿里雲內部人員撰寫的阿里雲存儲OSS使用教程,對使用OSS的同學們很有幫助!

阿里雲存儲OSS使用技巧之一:在OSS上讀寫文件


從你的代碼中,把fopen()、fclose()這類的函數刪掉吧!取而代之的是RESTful風格的HTTP請求:寫文件是PUT;讀文件是GET;獲取文件屬性是HEAD;刪除文件是DELETE。
在搭建好的OSS Python開發環境下,直接用上步聲明的my_store對象創建並寫入一個新文件(OSS稱之為Object)的代碼如下:

res = my_store.put_object(bucket_name, object_name, input_content, content_type)

上例中,content_type可以根據需求,填入HTTP協議中規定的某一種文件類型。如JPG圖片使用“image/jpeg”,MP3文件 使用“audio/mpeg”,具體定義請參考RFC 2616。選擇正確的content-type,可以讓其他互聯網應用直接正確地使用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)

通過上面列舉的這四個簡單的函數,你就可以輕松地將建立在傳統文件系統上的應用移植到OSS這個雲存儲平台上來了。

阿里雲存儲OSS使用技巧之二:通過簽名URL防盜鏈

由於OSS有着非常優秀的網絡帶寬質量,很多朋友希望基於OSS開發圖片、音樂、視頻等網站和應用。但如何有效地防盜鏈是個讓人頭疼的問題。這里介紹一個簡單且安全的方法:通過簽名URL防盜鏈。
首先,確認自己的bucket權限是private,即這個bucket的所有請求必須在簽名認證通過后才被認為是合法的。然后根據操作類型、要訪問的 bucket、要訪問的object以及超時時間,動態地生成一個經過簽名的URL。通過這個簽名URL,你授權的用戶就可以在該簽名URL過期時間前執 行相應的操作。

簽名的python代碼如下:

url = my_store.sign_url (method, bucket_name, object_name,timeout = 60)

其中method可以是PUT,GET,HEAD,DELETE中的任意一種;最后一個參數“timeout”是超時的時間,單位是秒。一個通過上面python方法,計算得到的簽名URL為:

http://storage.aliyun.com/sharedata/lingyun.jpg?OSSAccessKeyId=y6h7nbcothehv cp7jlnwmrw9&Expires=1335084740&Signature=LZeqnHSo5WkDNWKffKDgQBXR6fY=

通過這種動態計算簽名URL的方法,可以有效地保護放在OSS上的數據,防止被其他人盜鏈。

阿里雲存儲OSS使用技巧之三:滿足特定條件時才傳輸數據

IMS(If-Modified-Since)參數是HTTP協議中,經常被用到的一個參數。它的含義是:通過這個時間戳參數,服務器端可以判斷客 戶端的數據是否是最新的;如果不是最新的,則返回服務器端的數據;如果是最新的,則返回 304 告訴客戶端其本地 cache 的頁面是最新的,於是客戶端就可以直接從本地加載數據了。這樣在網絡上傳輸的數據量就會大大減少,同時也減輕了服務器的負擔。
包括IMS在內,OSS共支持四種條件傳輸參數。只有Object的屬性滿足客戶端給出的條件時,OSS才傳輸Object的數據。這四個參數是:
l If-Modified-Since
l If-Unmodified-Since
l If-Match
l If-None-Match

If-Unmodified-Since的含義和If-Modified-Since正好相反:如果內容沒更新,則返回數據;否則返回HTTP狀態 碼304。If-Unmodified-Since和If-Modified-Since這兩個參數可以一起使用,以指定一個時間窗口。例如:

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這對參數與If-Unmodified-Since、If-Modified-Since參數的含義 類似,只是參數不是時間戳,而是內容的MD5值。利用好這四個參數,可以節省大量的流量,也就是可以節省很多money。

阿里雲存儲OSS使用技巧之四:OSS上如何實現文件夾功能

許多終端用戶習慣了文件夾這個概念,而較難適應只有bucket和object的雲存儲邏輯。但我們可以基於OSS從邏輯上實現文件夾功能。

首先,我們可以按照慣例,認為所有以“/”[1]結尾的Object都是一個文件夾。例如,用戶認為:“folder”是一個文件;“folder /”是一個文件夾;而“folder/file.txt”是一個放在folder文件夾內名為file.txt的文件。在雲存儲OSS上,“folder /”、“folder”和“folder/file.txt”其實都是object。
當用戶需要查詢一個文件夾下的文件時,我們就需要巧妙地通過List Object(Get Bucket)接口的四個參數:prefix,marker,delimiter和max-keys來實現。

例如,我們在OSS上名為”mydata”的bucket內有如下幾個文件:

lingyun.doc folder/ folder/file1.txt folder/file2.txt folder/file3.txt folder/image/ folder/image/test.jpg

如果認為這個bucket是一個傳統文件系統的話,當用戶進入該bucket,應該只看到一個名為“lingyun.doc”的文件和一個名為 “folder/”的文件夾。為了獲得這樣的效果,我們將List Object請求的delimiter參數設為“/”即可,代碼如下:

res = my_store.list_objects("mydata", delimiter='/')

OSS收到這個請求后,會返回一個XML格式的消息,中間記錄了這個bucket內有一個key為“lingyun.doc”的文件,以及一個名為 “folder”的common prefix,分別對應於文件和文件夾。當繼續想查看文件夾”folder”內的文件列表時,可以將prefix參數設為“folder/”,代碼如下:

res = my_store.list_objects("mydata", prefix=’folder/’, delimiter='/')

執行后,我們就可以知道文件夾“folder”內,有三個文件:“file1.txt”,“file2.txt”,“file3.txt”和一個子文件夾:“image/”。
list objects命令的另一個參數是max-keys,它定義了在一次請求內OSS返回文件和文件夾最大的數目,默認值是100,最大可以設成1000。但 如果一個文件夾內有超過1000個文件怎么辦?這時,可以利用list objects的最后一個參數——marker。這個參數告訴OSS從指定的文件開始,按照字典序
查其后面的文件。示例代碼為:

res = my_store.list_objects("mydata", prefix='folder/', marker='folder/file1.txt', delimiter='/', maxkeys='1')

這時,OSS只會返回一個查詢結果:“folder/file2.txt”。利用好這四個參數,你會發現做個類似於DropBox[2]的應用是如此的簡單。

阿里雲OSS使用技巧之五:實現Object斷點下載和並發下載

從互聯網上下載數據時,支持斷點下載是一項非常基本的功能。其原理很簡單,就是記住上次接受數據的位置,然后要求服務器從上次斷點的地方開始將余下 的部分傳輸過來。下載OSS上的Object時,可以采用HTTP請求中通用的Range這一header,來完成這個功能。例如:
獲取一個文件的頭5個字節的請求代碼如下:

Headers = {} headers['range'] = "bytes=0-4" res = my_store.get_object (bucket_name, object_name, headers)

獲取一個文件中間3KB字節數據的請求代碼如下:

Headers = {} headers['range'] = "bytes=1024-4095" res = my_store.get_object (bucket_name, object_name, headers)

知道了如何使用range來隨機讀一個object后,實現並發下載就輕而易舉了。只要將要下載的object分成若干份,然后開多個線程,每個線程下載其中的一塊。在所有塊都下載完成后,整個文件就下載完成了。
注意:按照HTTP協議,如果用戶的請求中含有range字段,則服務器返回的HTTP狀態碼為206 (Partial Content 客戶發送了一個帶有Range頭的GET請求,服務器完成了它)。

阿里雲存儲OSS使用技巧之六:實現大文件並發上傳

由於OSS是一個互聯網服務,用戶終端很難長時間保證和OSS之間的TCP連接。所以在上傳一個大文件時會經常發生請求鏈接被斷開的情況。

這時候就可以采用OSS的multipart Upload模式。

Multipart Upload模式的原理是將一個較大的文件,在客戶端拆成多個適合上傳的小片(Part),然后分別上傳至OSS服務器端,最后在服務器端組合成一個大文件。由於每個小片是獨立上傳的,它們之間沒有任何的關聯,所以利用這種模式就可以做到並發上傳。

雖然原理看起來很麻煩,但是如果使用OSS提供的SDK的話,只要一行命令就搞定了並發上傳:

res = my_store.multi_upload_file(bucket_name, object_name,thread_num = 10)

具體實現細節請參考OSS API開發文檔和SDK內部的實現邏輯,有興趣的同學可以按照自己特定的需求自己實現一下。

阿里雲OSS使用技巧之七:刪除一個有大量Object的bucket

有一天,也許你只是看着自己的一個bucket不爽,想刪除它。但OSS服務出於保護數據的考慮會溫柔地通知你:這個bucket里面還有數據,不 能刪除它。打開這個bucket一看,成千上萬的文件在那里等着你去刪。一個一個刪,肯定太stupid了。這里教你一個小方法:先獲取Object列 表,再使用批量刪除接口。在Python的SDK中已經封裝好了與之對應的接口:

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

這樣,刪除幾萬個文件,也就是幾十個請求的事情,不但節省了請求次數,更為我們節省了大量的寶貴時間。

阿里雲OSS使用技巧之八:為Object添加自定義的Header

很多情況下,我們希望對文件的META屬性中放入一些自定義的信息數據。例如,一張照片的拍攝時間;一篇文章的作者;一首歌曲的專輯名;甚至是一個專利的專利號。這樣,我們在查看文件的META屬性時,就可以獲取這些自定義的信息數據,而不必將整個文件下載下來。
在使用OSS時,可以通過在PutObject的時候把自定義的信息數據放在以x-oss-meta-為前綴的參數中。OSS將把這些參數視為用戶自定義的meta數據。添加x-oss-meta-author的實現代碼為:

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上調試自己的代碼

大家在用OSS開發時,如果發送了非法或者不符合規則的HTTP請求,OSS會返回錯誤碼和相應的信息來幫助開發者發現和定位問題。OSS對於所有 HTTP返回碼不是2XX的請求,都會返回一個XML結構的消息體,里面詳細記錄了無法執行用戶請求的原因。例如,如果你嘗試訪問一個你沒有訪問權限的 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”字段是唯一標識該次請求的UUID;當你無法解決問題時,可以憑這個RequestId來請求OSS開發工程師的幫助。

后記:
通過上述OSS開發小技巧的介紹,相信大家一定對OSS這個雲存儲服務有了更深刻的理解。俗話說“高手在民間”,祝大家可以在此基礎上開發出類似DropBox、DrawSomething、Instagram等成功應用。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM