Azure 基礎:Blob Storage


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

筆者在前文中介紹了 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。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 的名稱規則,足以說明其重要性,本文試圖以簡要的文字進行描述:

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);
}

重新在瀏覽器中訪問一次試試:

可要小心喲,要是不小心把私密的文件放到了這個 Container 中可就慘了!

刪除 Blob 文件

mypicture.png 已經完成了演示的使命,可以刪除它了:

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

總結

Blob Storage 以其豐富的類型(block, append, page)為各類應用場景提供了最優的選擇。本文僅僅是入門的介紹,更多的場景如用 Blob 存儲設置 cdn ,如何對數據進行加密存儲等內容都沒有涉及。希望對剛接觸 Azure 的朋友有所幫助。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM