標籤:python
安裝 Azure Storage SDK for Python
最簡單的方式是在安裝了 python 和 pip 的機器上直接執行下面的命令:
pip install azure-storage
安裝完成後通過 pip freeze 命令查看安裝的版本:
650) this.width=650;" src="http://images2015.cnblogs.com/blog/952033/201706/952033-20170610200907403-1170195064.png" style="margin:0px;padding:0px;border:0px;" />
由於 Azure Storage SDK for Python 是一個開源項目,所以你也可以通過原始碼安裝它,請參考官方文檔。
建立 Blob Container
由於任何一個 Blob 都必須包含在一個 Blob Container 中,所以我們的第一個任務是建立 Blob Container。
SDK 為我們提供了一個名為 BlockBlobService 的對象。通過這個對象我們可以建立並操作 Blob Container。下面的代碼建立一個名為"nickcon" 的 Container:
650) this.width=650;" src="http://images2015.cnblogs.com/blog/952033/201706/952033-20170610201045309-1909472858.png" style="margin:0px;padding:0px;border:0px;" />
代碼本身很簡單,其中的 account_name 和 account_key 是你的 storage 帳號及其訪問 key。我們使用 GUI 工具 Microsoft Azure Storage Explorer 查看代碼操作的結果:
650) this.width=650;" src="http://images2015.cnblogs.com/blog/952033/201706/952033-20170610201134168-1882957775.png" style="margin:0px;padding:0px;border:0px;" />
名為 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 對象。
650) this.width=650;" src="/img/fz.gif" alt="複製代碼" style="margin:0px;padding:0px;border:none;" />
from azure.storage.blob import BlockBlobServicefrom azure.storage.blob import ContentSettingsmystoragename = "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‘))
650) this.width=650;" src="/img/fz.gif" alt="複製代碼" style="margin:0px;padding:0px;border:none;" />
這次我們引入了類型 ContentSettings,主要是指定檔案的類型。注意 create_blob_from_path 方法的第二個參數,我們需要為新的 blob 對象指定一個名字。第一個參數是目標 Container, 第三個參數是要上傳的本地檔案路徑。執行上面的指令碼,會把本地的一張壁紙 cortana-wallpaper.jpg 上傳到 Azure Blob Container 中:
650) this.width=650;" src="http://images2015.cnblogs.com/blog/952033/201706/952033-20170610201538231-1852543441.png" style="margin:0px;padding:0px;border:0px;" />
在 Container 中建立的 Blob 對象的名稱已經不是源檔案的名稱了,而是我們指定的 myblobcortana.jpg。
控制存取權限
存放在 Blob Container 中的檔案都有對應的 URL,這是 Azure Blob Storage 的預設策略。為的是我們可以從任何地方通過 URL 來訪問這些檔案。比如 myblobcortana.jpg 檔案的 URL 為:
https://nickpsdk.blob.core.windows.net/nickcon/myblobcortana.jpg
直接把這個地址粘貼到瀏覽器的地址欄裡:
650) this.width=650;" src="http://images2015.cnblogs.com/blog/952033/201706/952033-20170610202153340-345491664.png" style="margin:0px;padding:0px;border:0px;" />
啊哦,尷尬了,收到了一個無情的 error!
認真想一下,收到這樣的錯誤是合理的。否則任何人都能看到我儲存的檔案內容,隱私何在?還會有人為 Azure Blob Storage 付費嗎?事情的真相是這樣的,預設情況下我們建立的 Blob Container 和 Blob 對象都是私人的,也就是必須通過帳號和 access key 才能訪問。如果你要想讓內容變成大家都能訪問的公用資源,可以在建立時指定為 PublicAccess。也可以在建立完成後修改它的屬性為 PublicAccess。下面我們把 nickcon Container 設定為 PublicAccess:
650) this.width=650;" src="/img/fz.gif" alt="複製代碼" style="margin:0px;padding:0px;border:none;" />
from azure.storage.blob import BlockBlobServicefrom azure.storage.blob import PublicAccessmystoragename = "xxxx"mystoragekey = "yyyy"blob_service = BlockBlobService(account_name=mystoragename, account_key=mystoragekey)blob_service.set_container_acl(‘nickcon‘, public_access=PublicAccess.Container)
650) this.width=650;" src="/img/fz.gif" alt="複製代碼" style="margin:0px;padding:0px;border:none;" />
此處 import 了 PublicAccess 類型,並調用 set_container_acl 方法來修改 Container 的存取權限。試試重新重新整理一下網頁:
650) this.width=650;" src="http://images2015.cnblogs.com/blog/952033/201706/952033-20170610202344856-1638533740.png" style="margin:0px;padding:0px;border:0px;" />
此時就不要再往你的 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 中的內容備份到本地磁碟上:
650) this.width=650;" src="/img/fz.gif" alt="複製代碼" style="margin:0px;padding:0px;border:none;" />
from azure.storage.blob import BlockBlobServiceimport osmystoragename = "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)
650) this.width=650;" src="/img/fz.gif" alt="複製代碼" style="margin:0px;padding:0px;border:none;" />
此處需要注意一點,blob.name 包含了檔案在 container 中的目錄。比如一個檔案在 Blob Container 中的路徑為 abc/test.txt,那麼它的 blog.name 就是 abc/test.txt。要保持檔案在 Blob Container 的名稱及路徑就要在本地建立對應的目錄結構。
Python 操作 Azure Blob Storage