筆者在《Azure 基礎:Blob Storage》一文中介紹了 Azure Blob Storage 的基本概念,并通過 C# 代碼展示了如何進行基本的操作。最近筆者需要在 Linux 系統(tǒng)中做類似的事情,于是決定使用 Azure 提供的 Azure Storage SDK for Python 來操作 Blob Storage。這樣今后無論在 Windows 上還是 Linux上,都用 Python 就可以了。對 Azure Blob Storage 概念還不太熟悉的同學請先參考前文。

安裝 Azure Storage SDK for Python

最簡單的方式是在安裝了 python 和 pip 的機器上直接執(zhí)行下面的命令:

pip install azure-storage

安裝完成后通過 pip freeze 命令查看安裝的版本:

移動開發(fā)培訓,Android培訓,安卓培訓,手機開發(fā)培訓,手機維修培訓,手機軟件培訓

由于 Azure Storage SDK for Python 是一個開源項目,所以你也可以通過源代碼安裝它,請參考官方文檔。

創(chuàng)建 Blob Container

由于任何一個 Blob 都必須包含在一個 Blob Container 中,所以我們的第一個任務是創(chuàng)建 Blob Container。
SDK 為我們提供了一個名為 BlockBlobService 的對象。通過這個對象我們可以創(chuàng)建并操作 Blob Container。下面的代碼創(chuàng)建一個名為"nickcon" 的 Container:

移動開發(fā)培訓,Android培訓,安卓培訓,手機開發(fā)培訓,手機維修培訓,手機軟件培訓

代碼本身很簡單,其中的 account_name 和 account_key 是你的 storage 賬號及其訪問 key。我們使用 GUI 工具 Microsoft Azure Storage Explorer 查看代碼操作的結果:

移動開發(fā)培訓,Android培訓,安卓培訓,手機開發(fā)培訓,手機維修培訓,手機軟件培訓

名為 nickcon 的 Blob Container 已經被成功的創(chuàng)建了。

上傳文件

接下來我們要把本地的文件上傳到剛才創(chuàng)建的 Blob Container 中。Azure SDK 為我們提供了下面四個方法:

create_blob_from_path #上傳指定路徑的文件。create_blob_from_stream #把一個數據流中的內容上傳。create_blob_from_bytes #上傳一個 bype 數組。create_blob_from_text #使用特定的編碼格式上傳字符串。

是的,你沒有看錯,所有方法的名字中都沒有 upload 字眼,而是使用了 create。這也說明上傳文件的本質是在云端創(chuàng)建一個 Blob 對象。

移動開發(fā)培訓,Android培訓,安卓培訓,手機開發(fā)培訓,手機維修培訓,手機軟件培訓

from azure.storage.blob import BlockBlobServicefrom 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'))

移動開發(fā)培訓,Android培訓,安卓培訓,手機開發(fā)培訓,手機維修培訓,手機軟件培訓

這次我們引入了類型 ContentSettings,主要是指定文件的類型。注意 create_blob_from_path 方法的第二個參數,我們需要為新的 blob 對象指定一個名字。第一個參數是目標 Container, 第三個參數是要上傳的本地文件路徑。執(zhí)行上面的腳本,會把本地的一張壁紙 cortana-wallpaper.jpg 上傳到 Azure Blob Container 中:

移動開發(fā)培訓,Android培訓,安卓培訓,手機開發(fā)培訓,手機維修培訓,手機軟件培訓

在 Container 中創(chuàng)建的 Blob 對象的名稱已經不是源文件的名稱了,而是我們指定的 myblobcortana.jpg。

控制訪問權限

存放在 Blob Container 中的文件都有對應的 URL,這是 Azure Blob Storage 的默認策略。為的是我們可以從任何地方通過 URL 來訪問這些文件。比如 myblobcortana.jpg 文件的 URL 為:

https://nickpsdk.blob.core.windows.net/nickcon/myblobcortana.jpg
直接把這個地址粘貼到瀏覽器的地址欄里:

移動開發(fā)培訓,Android培訓,安卓培訓,手機開發(fā)培訓,手機維修培訓,手機軟件培訓

啊哦,尷尬了,收到了一個無情的 error!

認真想一下,收到這樣的錯誤是合理的。否則任何人都能看到我保存的文件內容,隱私何在?還會有人為 Azure Blob Storage 付費嗎?事情的真相是這樣的,默認情況下我們創(chuàng)建的 Blob Container 和 Blob 對象都是私有的,也就是必須通過賬號和 access key 才能訪問。如果你要想讓內容變成大家都能訪問的公共資源,可以在創(chuàng)建時指定為 PublicAccess。也可以在創(chuàng)建完成后修改它的屬性為 PublicAccess。下面我們把 nickcon Container 設置為 PublicAccess:

移動開發(fā)培訓,Android培訓,安卓培訓,手機開發(fā)培訓,手機維修培訓,手機軟件培訓

from azure.storage.blob import BlockBlobServicefrom 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)

移動開發(fā)培訓,Android培訓,安卓培訓,手機開發(fā)培訓,手機維修培訓,手機軟件培訓

此處 import 了 PublicAccess 類型,并調用 set_container_acl 方法來修改 Container 的訪問權限。試試重新刷新一下網頁:

移動開發(fā)培訓,Android培訓,安卓培訓,手機開發(fā)培訓,手機維修培訓,手機軟件培訓

此時就不要再往你的 Blob Container 中放隱私照了哦!

列出 Blob Container 中的所有文件

檢查 Container 中都有哪些文件是很重要的操作,當然我們可以輕松的完成:

generator = blob_service.list_blobs('nickcon')for blob in generator:print(blob.name)

使用 list_blobs 方法可以獲得 Container 中的所有 Blob 對象。上面的代碼打印了所有 Blob 對象的名稱。

下載 Blob 對象

和創(chuàng)建 Blob 對象一樣,也有四個方法可以下載 Blob 對象。簡單期間我們只演示 get_blob_to_path 方法,其它的用法類似:

blob_service.get_blob_to_path('nickcon', 'myblobcortana.jpg', 'newimage.png')

其中第二個參數為 Container 中 Blob 對象的名稱,第三個參數為保存到本地文件的路徑。

刪除 Blob 對象

有創(chuàng)建自然有刪除,代碼很簡單,不再啰嗦:

blob_service.delete_blob('nickcon', 'myblobcortana.jpg')

備份 Blob Container 中的文件

是的,你沒聽錯!
我們相信云存儲的安全性,但把重要的數據備份到其它的存儲上也是需要的。下面的代碼會把一個 Azure Storage Account 中的所有 Blob Container 中的內容備份到本地磁盤上:

移動開發(fā)培訓,Android培訓,安卓培訓,手機開發(fā)培訓,手機維修培訓,手機軟件培訓

from azure.storage.blob import BlockBlobServiceimport 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)        # 檢查文件目錄是否存在,不存在就創(chuàng)建
        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 ContainercontainerGenerator = blob_service.list_containers()for con in containerGenerator:
    downloadFilesInContainer(con.name)

移動開發(fā)培訓,Android培訓,安卓培訓,手機開發(fā)培訓,手機維修培訓,手機軟件培訓

此處需要注意一點,blob.name 包含了文件在 container 中的目錄。比如一個文件在 Blob Container 中的路徑為 abc/test.txt,那么它的 blog.name 就是 abc/test.txt。要保持文件在 Blob Container 的名稱及路徑就要在本地創(chuàng)建對應的目錄結構。

總結

最后的 demo 可以簡單的實現備份所有 Blob 文件的功能。由于微軟把相關接口封裝的很清晰,所以代碼非常的簡短。使用 Python 的好處是可以在不同的平臺上運行相同的代碼。當你需要在不同的操作系統(tǒng)中做同樣的事情時,這可太棒了!

作者:sparkdev

出處:http://www.cnblogs.com/sparkdev/

本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。

http://www.cnblogs.com/sparkdev/p/6979802.html