Azure Storage 是微軟 Azure 雲提供的雲端存儲解決方案,當前支持的存儲類型有 Blob、Queue、File 和 Table。瀏覽器
筆者在《Azure Table storage 基本用法》一文中,介紹了 Table Storage 的基本用法,本文將經過 C# 代碼介紹 Blob Storage 的主要使用方法。app
Azure Blob Storage 是用來存放大量的像文本、圖片、視頻等非結構化數據的存儲服務。咱們能夠在任何地方經過互聯網協議 http 或者 https 訪問 Blob Storage。簡單說,就是把文件放在雲上,給它一個 URL,經過這個 URL 來訪問文件。這就涉及到一個問題:如何控制訪問權限?答案是咱們能夠根據本身的須要,設置 Blob 對象是隻能被本身訪問,仍是能夠被全部人訪問。分佈式
下面是 Blog Storage 典型的應用場景:工具
下圖描述了 Blob Storage 的基本組織結構:性能
Storage Account 是用來管理 Azure Storage 的一個命名空間,主要用來控制存儲數據的訪問權限和計費。對於 Blob、Queue、File 和 Table 這些 Azure 提供的存儲服務的訪問控制,都是經過 Storage Account 來進行的,因此要想使用 Blob Storage,首先須要建立你的 Storage Account。優化
Container 中包含一組資源,全部的 Blob 都必須存在於Container中。一個 Storage Account 中能夠包含無限個 Container,每一個Container中也能夠包含無限個Blob。須要注意的是 Container 的名字必須所有小寫。加密
一個Blob 就表明一個文件。爲了區分應用的場景及提高不一樣應用場景下存儲的性能,又爲 Blob 劃分了不一樣的類型:block blobs, page blobs,append blobs。spa
若是你還不熟悉 Azure Storage Account 的使用,以及如何經過 WindowsAzure.Storage 庫訪問 Azure Storage,請參考前文《Azure Table storage 基本用法》中的介紹。.net
爲了方便查看 C# 代碼執行的結果,本文使用了 MS 發佈的一個 Azure Storage 客戶端工具:Microsoft Azure Storage Explorer,文中簡稱爲 Storage Explorer。日誌
接下來咱們直接經過 C# 代碼來介紹如何操做 Blob Storage。
因爲任何一個 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 已經建立:
MSDN 上不厭其煩的描述 Blob Container 的名稱規則,足以說明其重要性,本文試圖以簡要的文字進行描述:
違反任何一個規則,在建立 Blob Container 時都會受到 (400) Bad Request 錯誤。
咱們上傳一個文件到剛纔建立的 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 中的全部 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 對象的代碼:
// 建立名稱爲 mypicture.png 的 Blob 對象的引用。 CloudBlockBlob blockBlob = container.GetBlockBlobReference("mypicture.png"); // 把文件保存到本地。 using (var fileStream = System.IO.File.OpenWrite(fileName)) { blockBlob.DownloadToStream(fileStream); }
Mypicture.png 被下載到本地指定的文件中。
咱們在本文開始的地方就強調能夠經過 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); }
從新在瀏覽器中訪問一次試試:
注意,針對上傳文件的權限須要謹慎處理,我的文件不建議設置爲任何人都能訪問。
mypicture.png 已經完成了演示的使命,經過如下命令就能夠刪除它了:
CloudBlockBlob blockBlob = container.GetBlockBlobReference("mypicture.png"); blockBlob.Delete();
Blob Storage 以其豐富的類型(block,append,page)爲各種應用場景提供了最優的選擇。本文僅僅是入門的介紹,更多的場景如用 Blob 存儲設置 cdn ,如何對數據進行加密存儲等內容都沒有涉及。但願對剛接觸 Azure 的朋友有所幫助。