Python 操作 Azure Blob Storage

安裝 Azure Storage SDK for Python

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

pip install azure-storage

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

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

創建 Blob Container

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

代碼本身很簡單,其中的 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 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'))

複製代碼

這次我們引入了類型 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 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)

複製代碼

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

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

列出 Blob Container 中的所有文件

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

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

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

下載 Blob 對象

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

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

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

刪除 Blob 對象

有創建自然有刪除,代碼很簡單,不再囉嗦:

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

備份 Blob Container 中的文件

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

複製代碼

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)        # 檢查文件目錄是否存在,不存在就創建
        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)

複製代碼

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章