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

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 典型的應用場景:

  1. 存儲圖片和文檔,這些文件可以直接通過瀏覽器訪問。
  2. 支持分佈式訪問,主要用於 cdn。
  3. 提供視頻、音頻流。
  4. 存儲基本的文件備份和歸檔文件。

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。

  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 已經創建:

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 看看上傳的結果:

圖片中顯示文件已經上傳成功!

遍歷 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 粘貼到瀏覽器的地址欄中。

怎麼回事?文件不存在嗎?不是的,默認情況下,你的文件是被保護的,只有通過你的 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 的朋友有所幫助。

發佈了7 篇原創文章 · 獲贊 1 · 訪問量 8916
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章