Azure Storage 是微軟 Azure 雲提供的雲端存儲解決方案,當前支持的存儲類型有 Blob、Queue、File 和 Table。
筆者在《Azure Table storage 基本用法》一文中,介紹了 Table Storage 的基本用法,本文將通過 C# 代碼介紹 Blob Storage 的主要使用方法。
文章來源:葡萄城產品技術社區
Blob Storage 是什么?
Azure Blob Storage 是用來存放大量的像文本、圖片、視頻等非結構化數據的存儲服務。我們可以在任何地方通過互聯網協議 http 或者 https 訪問 Blob Storage。簡單說,就是把文件放在雲上,給它一個 URL,通過這個 URL 來訪問文件。這就涉及到一個問題:如何控制訪問權限?答案是我們可以根據自己的需要,設置 Blob 對象是只能被自己訪問,還是可以被所有人訪問。
下面是 Blog Storage 典型的應用場景:
- 存儲圖片和文檔,這些文件可以直接通過瀏覽器訪問。
- 支持分布式訪問,主要用於 cdn。
- 提供視頻、音頻流。
- 存儲基本的文件備份和歸檔文件。
Azure Blob Storage 的結構
下圖描述了 Blob Storage 的基本組織結構:
- Azure Storage Account:
Storage Account 是用來管理 Azure Storage 的一個命名空間,主要用來控制存儲數據的訪問權限和計費。對於 Blob、Queue、File 和 Table 這些 Azure 提供的存儲服務的訪問控制,都是通過 Storage Account 來進行的,所以要想使用 Blob Storage,首先需要創建你的 Storage Account。
- Container:
Container 中包含一組資源,所有的 Blob 都必須存在於Container中。一個 Storage Account 中可以包含無限個 Container,每個Container中也可以包含無限個Blob。需要注意的是 Container 的名字必須全部小寫。
- Blob:
一個Blob 就代表一個文件。為了區分應用的場景及提升不同應用場景下存儲的性能,又為 Blob 划分了不同的類型:block blobs, page blobs,append blobs。
- Block blobs 主要用來存儲靜態的文件,比如圖片、電影和文檔。
- Append blobs 與 block blobs 類似,但優化了 append 操作,主要的應用場景是存儲日志文件。
- Page blobs 針對頻繁的讀寫操作做了優化,如 Azure 上虛擬機的磁盤,就是使用的 page blobs。
如果你還不熟悉 Azure Storage Account 的使用,以及如何通過 WindowsAzure.Storage 庫訪問 Azure Storage,請參考前文《Azure Table storage 基本用法》中的介紹。
為了方便查看 C# 代碼執行的結果,本文使用了 MS 發布的一個 Azure Storage 客戶端工具:Microsoft Azure Storage Explorer,文中簡稱為 Storage Explorer。
接下來我們直接通過 C# 代碼來介紹如何操作 Blob Storage。
創建 Blob Container
由於任何一個 Blob 都必須包含在一個 Blob Container 中,所以我們第一步先創建一個名為“picturecontainer”的 Blob Container:
//CloudStorageAccount 類表示一個 Azure Storage Account,我們需要先創建它的實例,才能訪問屬於它的資源。 //注意連接字符串中的xxx和yyy,分別對應Access keys中的Storage account name 和 key。 CloudStorageAccount storageAccount = CloudStorageAccount.Parse("DefaultEndpointsProtocol=https;AccountName=xxx;AccountKey=yyy");
//CloudBlobClient 類是 Windows Azure Blob Service 客戶端的邏輯表示,我們需要使用它來配置和執行對 Blob Storage 的操作。 CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
//CloudBlobContainer 表示一個 Blob Container 對象。 CloudBlobContainer container = blobClient.GetContainerReference("picturecontainer");
//如果不存在就創建名為 picturecontainer 的 Blob Container。 container.CreateIfNotExists();
執行上面的代碼,然后打開 Storage Explorer,刷新一下,看到名為“picturecontainer”的 Blob Container 已經創建:
Container 名稱規則
MSDN 上不厭其煩的描述 Blob Container 的名稱規則,足以說明其重要性,本文試圖以簡要的文字進行描述:
- 以小寫字母或數字開頭,只能包含字母、數字和 dash(-)。
- 不能有連續的 dash(-),dash(-)不能是第一個字符,也不能是最后一個字符。
- 所有字符小寫,總長度為 3-63 字符。
違反任何一個規則,在創建 Blob Container 時都會受到 (400) Bad Request 錯誤。
上傳 Blob 文件
我們上傳一個文件到剛才創建的 Container 中:
//mypicture.png 為放在 container 中的 Blob 的名稱。 //GetBlockBlobReference 方法獲得一個 Block 類型的 Blob 對象的引用。 //您可以根據應用的需要,分別調用 GetBlobReference,GetAppendBlobReference 或 GetPageBlobReference 來創建不同類型的 Blob 對象。 CloudBlockBlob blockBlob = container.GetBlockBlobReference("mypicture.png"); using (var fileStream = System.IO.File.OpenRead(file)) { // 這是一個同步執行的方法 blockBlob.UploadFromStream(fileStream); }
在代碼中我們通過調用剛才創建的 Container 對象 container 的 GetBlockBlobReference 方法,獲得了一個 CloudBlockBlob 類型的對象。然后通過它的 UploadFromStream 方法把一個本地的文件上傳到了雲端。
刷新 Storage Explorer 看看上傳的結果:
圖片中顯示文件已經上傳成功!
遍歷 Container 中的內容
如果我們想要羅列出一個 Container 中的所有 Blob 對象,就需要對整個 Container 進行遍歷操作:
foreach (IListBlobItem item in container.ListBlobs(null, false)) { if (item.GetType() == typeof(CloudBlockBlob)) { CloudBlockBlob blob = (CloudBlockBlob)item; // todo something } else if (item.GetType() == typeof(CloudAppendBlob)) { CloudAppendBlob appendBlob = (CloudAppendBlob)item; // todo something } else if (item.GetType() == typeof(CloudPageBlob)) { CloudPageBlob pageBlob = (CloudPageBlob)item; // todo something } else if (item.GetType() == typeof(CloudBlobDirectory)) { CloudBlobDirectory directory = (CloudBlobDirectory)item; // todo something } }
這段代碼中有兩處需要注意的地方:
- 獲得的 Blob 對象是有類型的。
- 可以獲得一個虛擬的目錄信息,其實是對文件名稱的解析。比如一個 Blob 的名稱為 abc/flower.jpg,此時就能獲得一個名叫 abc 的虛擬目錄信息。
下載 Blob 文件
有上傳自然要有下載,看看下載一個 Blob 對象的代碼:
// 創建名稱為 mypicture.png 的 Blob 對象的引用。 CloudBlockBlob blockBlob = container.GetBlockBlobReference("mypicture.png"); // 把文件保存到本地。 using (var fileStream = System.IO.File.OpenWrite(fileName)) { blockBlob.DownloadToStream(fileStream); }
Mypicture.png 被下載到本地指定的文件中。
設置 Blob 的訪問權限
我們在本文開始的地方就強調可以通過 http 或 https 協議訪問 Blob Storage 文件,現在我們就嘗試一下。
在 Storage Explorer 中選擇 mypicture.png,右鍵,選擇“Copy URL to Clipboard”。把 URL 粘貼到瀏覽器的地址欄中。
怎么回事?文件不存在嗎?不是的,默認情況下,你的文件是被保護的,只有通過你的 Storage Account 驗證后才能訪問。如果想要把它設置為任何人都能訪問,需要通過設置 Container 的權限來實現。
private static void SetPublicContainerPermissions(CloudBlobContainer container) { BlobContainerPermissions permissions = container.GetPermissions(); // Container 中的所有 Blob 都能被訪問 permissions.PublicAccess = BlobContainerPublicAccessType.Container; container.SetPermissions(permissions); }
重新在瀏覽器中訪問一次試試:
注意,針對上傳文件的權限需要謹慎處理,個人文件不建議設置為任何人都能訪問。
刪除 Blob 文件
mypicture.png 已經完成了演示的使命,通過以下命令就可以刪除它了:
CloudBlockBlob blockBlob = container.GetBlockBlobReference("mypicture.png"); blockBlob.Delete();
總結
Blob Storage 以其豐富的類型(block,append,page)為各類應用場景提供了最優的選擇。本文僅僅是入門的介紹,更多的場景如用 Blob 存儲設置 cdn ,如何對數據進行加密存儲等內容都沒有涉及。希望對剛接觸 Azure 的朋友有所幫助。
相關閱讀:
Azure Queue Storage 基本用法 -- Azure Storage 之 Queue
Azure File Storage 基本用法 -- Azure Storage 之 File
Azure Table storage 基本用法 -- Azure Storage 之 Table