天天看點

Azure Blob Storage 基本用法 -- Azure Storage 之 Blob

Azure Storage 是微軟 Azure 雲提供的雲端存儲解決方案,目前支援的存儲類型有 Blob、Queue、File 和 Table。筆者在前文中介紹了Table Storage 的基本用法,本文将通過C# 代碼介紹Blob Storage的主要使用方法。

Azure Storage 是微軟 Azure 雲提供的雲端存儲解決方案,目前支援的存儲類型有 Blob、Queue、File 和 Table。

Azure Blob Storage 基本用法 -- Azure Storage 之 Blob

筆者在《​​Azure Table storage 基本用法​​》一文中,介紹了 Table Storage 的基本用法,本文将通過 C# 代碼介紹 Blob Storage 的主要使用方法。

Blob Storage 是什麼?

Azure Blob Storage 是用來存放大量的像文本、圖檔、視訊等非結構化資料的存儲服務。我們可以在任何地方通過網際網路協定 http 或者 https 通路 Blob Storage。簡單說,就是把檔案放在雲上,給它一個 URL,通過這個 URL 來通路檔案。這就涉及到一個問題:如何控制通路權限?答案是我們可以根據自己的需要,設定 Blob 對象是隻能被自己通路,還是可以被所有人通路。

下面是 Blog Storage 典型的應用場景:

  1. 存儲圖檔和文檔,這些檔案可以直接通過浏覽器通路。
  2. 支援分布式通路,主要用于 cdn。
  3. 提供視訊、音頻流。
  4. 存儲基本的檔案備份和歸檔檔案。

Azure Blob Storage 的結構

下圖描述了 Blob Storage 的基本組織結構:

Azure Blob Storage 基本用法 -- Azure Storage 之 Blob
  • 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。

  1. Block blobs 主要用來存儲靜态的檔案,比如圖檔、電影和文檔。
  2. Append blobs 與 block blobs 類似,但優化了 append 操作,主要的應用場景是存儲日志檔案。
  3. 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 已經建立:

Azure Blob Storage 基本用法 -- Azure Storage 之 Blob

Container 名稱規則

MSDN 上不厭其煩的描述 Blob Container 的名稱規則,足以說明其重要性,本文試圖以簡要的文字進行描述:

  1. 以小寫字母或數字開頭,隻能包含字母、數字和 dash(-)。
  2. 不能有連續的 dash(-),dash(-)不能是第一個字元,也不能是最後一個字元。
  3. 所有字元小寫,總長度為 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 看看上傳的結果:

Azure Blob Storage 基本用法 -- Azure Storage 之 Blob

圖檔中顯示檔案已經上傳成功!

周遊 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
    }
}      

這段代碼中有兩處需要注意的地方:

  1. 獲得的 Blob 對象是有類型的。
  2. 可以獲得一個虛拟的目錄資訊,其實是對檔案名稱的解析。比如一個 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 粘貼到浏覽器的位址欄中。

Azure Blob Storage 基本用法 -- Azure Storage 之 Blob

怎麼回事?檔案不存在嗎?不是的,預設情況下,你的檔案是被保護的,隻有通過你的 Storage Account 驗證後才能通路。如果想要把它設定為任何人都能通路,需要通過設定 Container 的權限來實作。

private static void SetPublicContainerPermissions(CloudBlobContainer container)
{
    BlobContainerPermissions permissions = container.GetPermissions();
    // Container 中的所有 Blob 都能被通路
    permissions.PublicAccess = BlobContainerPublicAccessType.Container;
    container.SetPermissions(permissions);
}      

重新在浏覽器中通路一次試試:

Azure Blob Storage 基本用法 -- Azure Storage 之 Blob

注意,針對上傳檔案的權限需要謹慎處理,個人檔案不建議設定為任何人都能通路。

删除 Blob 檔案

mypicture.png 已經完成了示範的使命,通過以下指令就可以删除它了:

CloudBlockBlob blockBlob = container.GetBlockBlobReference("mypicture.png");
blockBlob.Delete();      

總結