筆者在《Azure 基礎:Blob Storage》一文中介紹了 Azure Blob Storage 的基本概念,並經過 C# 代碼展現瞭如何進行基本的操做。最近筆者須要在 Linux 系統中作相似的事情,因而決定使用 Azure 提供的 Azure Storage SDK for Python 來操做 Blob Storage。這樣從此不管在 Windows 上仍是 Linux上,都用 Python 就能夠了。對 Azure Blob Storage 概念還不太熟悉的同窗請先參考前文。html
最簡單的方式是在安裝了 python 和 pip 的機器上直接執行下面的命令:python
pip install azure-storage
安裝完成後經過 pip freeze 命令查看安裝的版本:git
因爲 Azure Storage SDK for Python 是一個開源項目,因此你也能夠經過源代碼安裝它,請參考官方文檔。github
因爲任何一個 Blob 都必須包含在一個 Blob Container 中,因此咱們的第一個任務是建立 Blob Container。
SDK 爲咱們提供了一個名爲 BlockBlobService 的對象。經過這個對象咱們能夠建立並操做 Blob Container。下面的代碼建立一個名爲"nickcon" 的 Container:windows
代碼自己很簡單,其中的 account_name 和 account_key 是你的 storage 帳號及其訪問 key。咱們使用 GUI 工具 Microsoft Azure Storage Explorer 查看代碼操做的結果:數組
名爲 nickcon 的 Blob Container 已經被成功的建立了。瀏覽器
接下來咱們要把本地的文件上傳到剛纔建立的 Blob Container 中。Azure SDK 爲咱們提供了下面四個方法:安全
create_blob_from_path #上傳指定路徑的文件。 create_blob_from_stream #把一個數據流中的內容上傳。 create_blob_from_bytes #上傳一個 bype 數組。 create_blob_from_text #使用特定的編碼格式上傳字符串。
是的,你沒有看錯,全部方法的名字中都沒有 upload 字眼,而是使用了 create。這也說明上傳文件的本質是在雲端建立一個 Blob 對象。工具
from azure.storage.blob import BlockBlobService from azure.storage.blob import ContentSettings mystoragename = "xxxx" mystoragekey = "yyyy" blob_service = BlockBlobService(account_name=mystoragename, account_key=mystoragekey) blob_service.create_blob_from_path( 'nickcon', 'myblobcortana.jpg', 'cortana-wallpaper.jpg', content_settings=ContentSettings(content_type='image/jpg'))
此次咱們引入了類型 ContentSettings,主要是指定文件的類型。注意 create_blob_from_path 方法的第二個參數,咱們須要爲新的 blob 對象指定一個名字。第一個參數是目標 Container, 第三個參數是要上傳的本地文件路徑。執行上面的腳本,會把本地的一張壁紙 cortana-wallpaper.jpg 上傳到 Azure Blob Container 中:編碼
在 Container 中建立的 Blob 對象的名稱已經不是源文件的名稱了,而是咱們指定的 myblobcortana.jpg。
存放在 Blob Container 中的文件都有對應的 URL,這是 Azure Blob Storage 的默認策略。爲的是咱們能夠從任何地方經過 URL 來訪問這些文件。好比 myblobcortana.jpg 文件的 URL 爲:
https://nickpsdk.blob.core.windows.net/nickcon/myblobcortana.jpg
直接把這個地址粘貼到瀏覽器的地址欄裏:
啊哦,尷尬了,收到了一個無情的 error!
認真想一下,收到這樣的錯誤是合理的。不然任何人都能看到我保存的文件內容,隱私何在?還會有人爲 Azure Blob Storage 付費嗎?事情的真相是這樣的,默認狀況下咱們建立的 Blob Container 和 Blob 對象都是私有的,也就是必須經過帳號和 access key 才能訪問。若是你要想讓內容變成你們都能訪問的公共資源,能夠在建立時指定爲 PublicAccess。也能夠在建立完成後修改它的屬性爲 PublicAccess。下面咱們把 nickcon Container 設置爲 PublicAccess:
from azure.storage.blob import BlockBlobService from azure.storage.blob import PublicAccess mystoragename = "xxxx" mystoragekey = "yyyy" blob_service = BlockBlobService(account_name=mystoragename, account_key=mystoragekey) blob_service.set_container_acl('nickcon', public_access=PublicAccess.Container)
此處 import 了 PublicAccess 類型,並調用 set_container_acl 方法來修改 Container 的訪問權限。試試從新刷新一下網頁:
此時就不要再往你的 Blob Container 中放隱私照了哦!
檢查 Container 中都有哪些文件是很重要的操做,固然咱們能夠輕鬆的完成:
generator = blob_service.list_blobs('nickcon') for blob in generator: print(blob.name)
使用 list_blobs 方法能夠得到 Container 中的全部 Blob 對象。上面的代碼打印了全部 Blob 對象的名稱。
和建立 Blob 對象同樣,也有四個方法能夠下載 Blob 對象。簡單期間咱們只演示 get_blob_to_path 方法,其它的用法相似:
blob_service.get_blob_to_path('nickcon', 'myblobcortana.jpg', 'newimage.png')
其中第二個參數爲 Container 中 Blob 對象的名稱,第三個參數爲保存到本地文件的路徑。
有建立天然有刪除,代碼很簡單,再也不囉嗦:
blob_service.delete_blob('nickcon', 'myblobcortana.jpg')
是的,你沒聽錯!
咱們相信雲存儲的安全性,但把重要的數據備份到其它的存儲上也是須要的。下面的代碼會把一個 Azure Storage Account 中的全部 Blob Container 中的內容備份到本地磁盤上:
from azure.storage.blob import BlockBlobService import os mystoragename = "xxxx" mystoragekey = "yyyy" blob_service = BlockBlobService(account_name=mystoragename, account_key=mystoragekey) # 下載一個 Blob Container 中的全部文件 def downloadFilesInContainer(blobContainName): generator = blob_service.list_blobs(blobContainName) for blob in generator: # 得到 Blob 文件的目錄路徑 blobDirName = os.path.dirname(blob.name) # 把 Blob Container 的名稱也添加爲一級目錄 newBlobDirName = os.path.join(blobContainName, blobDirName) # 檢查文件目錄是否存在,不存在就建立 if not os.path.exists(newBlobDirName): os.makedirs(newBlobDirName) localFileName = os.path.join(blobContainName, blob.name) blob_service.get_blob_to_path(blobContainName, blob.name, localFileName) # 得到用戶全部的 Blob Container containerGenerator = blob_service.list_containers() for con in containerGenerator: downloadFilesInContainer(con.name)
此處須要注意一點,blob.name 包含了文件在 container 中的目錄。好比一個文件在 Blob Container 中的路徑爲 abc/test.txt,那麼它的 blog.name 就是 abc/test.txt。要保持文件在 Blob Container 的名稱及路徑就要在本地建立對應的目錄結構。
最後的 demo 能夠簡單的實現備份全部 Blob 文件的功能。因爲微軟把相關接口封裝的很清晰,因此代碼很是的簡短。使用 Python 的好處是能夠在不一樣的平臺上運行相同的代碼。當你須要在不一樣的操做系統中作一樣的事情時,這可太棒了!