Azure Storage 系列(二) .NET Core Web 項(xiàng)目中操作 Blob 存儲(chǔ)

來(lái)源: Allen
作者:Allen
時(shí)間:2020-09-10
16978
Azure Blob存儲(chǔ)是非結(jié)構(gòu)化的,它可以保存的數(shù)據(jù)類型是沒有任何限制的。如,pdf文檔,json文件,視頻,txt文件等。我們常見的類型的文件,它統(tǒng)統(tǒng)可以進(jìn)行存儲(chǔ)。但是Blob不適合需要經(jīng)常查詢的結(jié)構(gòu)化數(shù)據(jù),比如說(shuō)項(xiàng)目中使用的,它們具有比內(nèi)存和本地磁盤更高的延遲,并且沒有可讓數(shù)據(jù)庫(kù)高效運(yùn)行查詢的索引功能。

一,引言

上一篇文章,我們介紹到在實(shí)際項(xiàng)目中系統(tǒng)會(huì)產(chǎn)生大量的日志文件,用戶上傳的頭像等等,同時(shí)也介紹到可以使用Azure Blob Storage來(lái)存儲(chǔ)項(xiàng)目中的一些日志文件,用戶頭像,用戶視頻等等。這個(gè)時(shí)候,有人就會(huì)問到,那我大概明白Blob可以存放什么類型的數(shù)據(jù)了,這個(gè)時(shí)候就有人問一些問題了

1,什么是Blob?

答Azure Blob存儲(chǔ)是非結(jié)構(gòu)化的,它可以保存的數(shù)據(jù)類型是沒有任何限制的。如,pdf文檔,json文件,視頻,txt文件等。我們常見的類型的文件,它統(tǒng)統(tǒng)可以進(jìn)行存儲(chǔ)。但是Blob不適合需要經(jīng)常查詢的結(jié)構(gòu)化數(shù)據(jù),比如說(shuō)項(xiàng)目中使用的,它們具有比內(nèi)存和本地磁盤更高的延遲,并且沒有可讓數(shù)據(jù)庫(kù)高效運(yùn)行查詢的索引功能。但是,blob經(jīng)常用與數(shù)據(jù)庫(kù)一起用于存儲(chǔ)不可查詢的的數(shù)據(jù),例如用戶頭像存儲(chǔ)在Blob中,數(shù)據(jù)庫(kù)中保存對(duì)應(yīng)用戶頭像的Blob名稱或URL(來(lái)自微軟官方解釋)

其實(shí)用可以這么說(shuō),如果項(xiàng)目中有對(duì)于的圖片資源,視頻資源,文件等資源,我們就可以考慮到將這些數(shù)據(jù)都存儲(chǔ)在Azure Blob中。今天在文章的后半段我們將通過一個(gè)簡(jiǎn)單的.NET Core Web程序去操作Blob存儲(chǔ)對(duì)象。

--------------------我是分割線--------------------

Azure Blob Storage存儲(chǔ)系列:

1,Azure Storage系列(一)入門簡(jiǎn)介

2,Azure Storage系列(二).NET Core Web項(xiàng)目中操作Blob存儲(chǔ)

3,Azure Storage系列(三)Blob參數(shù)設(shè)置說(shuō)明

4,Azure Storage系列(四)在.Net上使用Table Storage

二,正文

開始之前我們看看Blob的類型

1,block blob(塊blob):由不同大小的塊構(gòu)成,在寫入到塊blob時(shí),需要將數(shù)據(jù)上傳到塊并將其提交到blob。

2,append blob(追加blob):是專用的塊blob,它僅支持追加新數(shù)據(jù),追加操作非常高效。追加blob非常適用于存儲(chǔ)日志或?qū)懭肓鲾?shù)據(jù)等方案。

3,page blob(頁(yè)blob):專用于涉及隨機(jī)存取讀寫的方案。頁(yè)blob用于存儲(chǔ)Azure虛擬機(jī)所使用的虛擬硬盤(VHD)文件,但它們非常適用于任何涉及到隨機(jī)存取的方案。

今天我們演示的是block blob類似,實(shí)際項(xiàng)目中,我們是如何進(jìn)行操作的

1,Azure Portal上進(jìn)行創(chuàng)建blob數(shù)據(jù)

找到之前創(chuàng)建好的“cnbateblogaccount”Storage Account,點(diǎn)擊圖中圈起來(lái)的“Containers”,進(jìn)行創(chuàng)建容器

ia_5200000001.png

點(diǎn)擊“+Container”,進(jìn)行創(chuàng)建容器

注意:這里的容器,我們可以理解為用來(lái)存儲(chǔ)對(duì)象的容器

ia_5200000002.png

Name:“picturecontainer”

Public access level選擇:“Private(no anonymous access)”(私有的,不允許匿名訪問)

點(diǎn)擊“Create"

ia_5200000003.png

創(chuàng)建完成后,我們就可以在當(dāng)前容器頁(yè)面看到自己創(chuàng)建的”picturecontainer“信息。

ia_5200000004.png

我們點(diǎn)擊容器進(jìn)入,嘗試在上傳一張圖片進(jìn)行測(cè)試

ia_5200000005.png

點(diǎn)擊“Select a file”進(jìn)行選擇

ia_5200000006.png

選擇“background.jpg”,點(diǎn)擊"打開"

ia_5200000007.png

勾選“Overwrite if file already exist”(如果文件存儲(chǔ),就覆蓋)

點(diǎn)擊“Upload”進(jìn)行上傳

ia_5200000008.png

我們可以看到上傳的圖片文件,并且它的Blob類型是“block blob”

ia_5200000009.png

同時(shí),我們可以還有在Portal上進(jìn)行預(yù)覽,編輯操作。

ia_5200000010.png

ok,上述操作我們是在Azure Portal上進(jìn)行操作的。接下來(lái)我們通過代碼進(jìn)行blob的增刪查

2,通過ASP.NET Core Web項(xiàng)目進(jìn)行Blob數(shù)據(jù)操作

vs2019新建Web項(xiàng)目

ia_5200000011.png

ia_5200000012.png

2.1,首先得安裝Azure.Storage相關(guān)的包

NuGet:Azure.Storage.Blobs

ia_5200000013.png

我們創(chuàng)建BlobExplorerController控制器

[HttpGet("{BlobName}")]

public async Task<IActionResult> GetBlob(string blobName)

{

     var data = await _blobService.GetBlobAsync(blobName);

     return File(data.Content, data.ContentType);

}

2.2,創(chuàng)建IBlobService接口,和BlobService實(shí)現(xiàn)類,新增獲取Blob的接口定義和具體實(shí)現(xiàn)方法

Task<BlobInfo> GetBlobAsync(string name);

#region 01,獲取Blob,根據(jù)blob名稱+async Task<BlobInfo> GetBlobAsync(string name)

/// <summary>

/// 獲取Blob,根據(jù)blob名稱

/// </summary>

/// <param name="name">blob名稱</param>

/// <returns></returns>

public async Task<Azure.Storage.Models.BlobInfo> GetBlobAsync(string name)

{

   var containerClient = _blobServiceClient.GetBlobContainerClient("picturecontainer");


   var blobClient = containerClient.GetBlobClient(name);

   var blobDownLoadInfo = await blobClient.DownloadAsync();

   return new Azure.Storage.Models.BlobInfo(blobDownLoadInfo.Value.Content, blobDownLoadInfo.Value.ContentType);

 }

 #endregion

創(chuàng)建BlobInfo返回實(shí)體信息

public class BlobInfo

    {

        public BlobInfo(Stream content, string contentType)

        {

            this.Content = content;

            this.ContentType = contentType;

        }

        public Stream Content { get; set; }


        public string ContentType { get; set; }

    }

2.3配置鏈接字符串

Azure Portal中找到創(chuàng)建的“cnbateaccount”的Azure Blob Atorage,點(diǎn)擊“Setting=&gt;Access key”

復(fù)制圖中的“Connection string”

ia_5200000020.png

將數(shù)據(jù)庫(kù)鏈接字符串配置在項(xiàng)目的appsettings配置文件中

{

  "Logging": {

    "LogLevel": {

      "Default": "Information",

      "Microsoft": "Warning",

      "Microsoft.Hosting.Lifetime": "Information"

    }

  },

  "AllowedHosts": "*",

  "AzureBlobStorageConnectionString": "DefaultEndpointsProtocol=https;AccountName=cnbateblogaccount;AccountKey=FU01h022mn1

JjONp+ta0DAXOO7ThK3dxxxxxxxxxxxxxxxxx891n9nycsTLGZF83nJpGvTIZvO5VCVxxxxxx0wndOOQ==;

EndpointSuffix=core.windows.net"

}

2.4,注入BlobService,BlobServiceClient

services.AddSingleton(x=&gt;new BlobServiceClient(Configuration.GetValue&lt;string("AzureBlobStorageConnectionString")));

services.AddSingleton&lt;IBlobSergvice,BlobService&gt;();

Ok,我們啟動(dòng)項(xiàng)目進(jìn)行測(cè)試

postman中輸入:localhost:9001/Blobs/background.jpg,效果如下圖所示:

ia_5200000023.png

瀏覽器訪問:http://localhost:9001/Blobs/background.jpg,效果如下圖所示:

ia_5200000024.png

ok,成功,成功獲取到之前在Portal上傳的圖片

2.5,完善對(duì)Blob數(shù)據(jù)的新增,刪除操作

BlobExplorerController完整代碼

BlobExplorerController

IBlobSergvice接口類

IBlobSergvice

BlobService實(shí)現(xiàn)類

BlobService

UpLoadContentRequest

UpLoadContentRequest

UploadFileRequest

UploadFileRequest

FileExtensions擴(kuò)展類

FileExtensions

目前我們分別添加了上傳圖片接口,上傳文件接口,刪除文件接口

我們分別在postman中進(jìn)行測(cè)試

(1)上傳圖片

FilePath(文件路徑):”C:\Users\admin\Desktop\2020904001.jpg“

FileName(文件名稱):”2020904001.jpg“

點(diǎn)擊”Send“,我們可以看到響應(yīng)返回狀態(tài)碼(Status)”200 OK“

ia_5200000037.png

同時(shí)在Portal上也可以看到剛剛選擇的”20200904001.jpg“文件

ia_5200000038.png

ia_5200000039.png

這里注意一下,為什么我們制定文件的路徑,和名稱就可以上傳文件,并且可以在瀏覽器中查看,那是因?yàn)槲覀冊(cè)谏蟼魑募性O(shè)置文件的請(qǐng)求頭的原因

private static readonly FileExtensionContentTypeProvider provider = new FileExtensionContentTypeProvider();


        public static string GetContentType(this string fileName)

        {

            if (!provider.TryGetContentType(fileName, out var contentType))

            {

                contentType = "application/octet-stream";

            }

            return contentType;

        }

public async Task UploadFileBlobAsync(string filePath, string filename)

        {

            var containerClient = _blobServiceClient.GetBlobContainerClient("picturecontainer");

            var blobClient = containerClient.GetBlobClient(filename);

            await blobClient.UploadAsync(filePath, new BlobHttpHeaders { ContentType = filePath.GetContentType() });

        }

(2)上傳json文件

Content:"{"Name":"zhangsan","Reamrk":"This is work!!!"}"

FileName:”log.json“

點(diǎn)擊”Send“,上傳Json文件

ia_5200000044.png

我們繼續(xù)在Portal上進(jìn)行查看上傳的json文件

ia_5200000045.png

ia_5200000046.png

(3)查看Blob信息

ia_5200000047.png

接下來(lái)還是刪除Blob數(shù)據(jù)的操作,我這里就不做演示了,大家可以自己調(diào)用接口進(jìn)行測(cè)試

好的,那今天的內(nèi)容就先到此結(jié)束,今天的目的只是通過簡(jiǎn)單的demo代碼去演示如果操作Azure Blob數(shù)據(jù),簡(jiǎn)單的跑跑代碼,在.NET Core中的demo代碼是怎么去寫的,具體的Azure.Storage類中的方法,參數(shù)等今天的內(nèi)容暫時(shí)不去解釋。

鼓掌,撒花??????????

三,結(jié)尾

今天的文章大概介紹了在Portal上如何上傳blob圖片文件,以及寫了一個(gè)簡(jiǎn)單的.NET Core demo程序,通過代碼我們我們?nèi)タ刂艬lob數(shù)據(jù)的增刪改查,下一篇繼續(xù)介紹Azure Storage在代碼中的操作,也著重講一下Azure.Storage中的類,以及方法的具體調(diào)用和說(shuō)明。

github:https://github.com/yunqian44/Azure.Storage.git

作者:Allen

版權(quán):轉(zhuǎn)載請(qǐng)?jiān)谖恼旅黠@位置注明作者及出處。如發(fā)現(xiàn)錯(cuò)誤,歡迎批評(píng)指正。

作者:Allen版權(quán):轉(zhuǎn)載請(qǐng)?jiān)谖恼旅黠@位置注明作者及出處。如發(fā)現(xiàn)錯(cuò)誤,歡迎批評(píng)指正。

立即登錄,閱讀全文
版權(quán)說(shuō)明:
本文內(nèi)容來(lái)自于Allen,本站不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。文章內(nèi)容系作者個(gè)人觀點(diǎn),不代表快出海對(duì)觀點(diǎn)贊同或支持。如有侵權(quán),請(qǐng)聯(lián)系管理員(zzx@kchuhai.com)刪除!
相關(guān)文章
Azure Arc為企業(yè)構(gòu)建安全的云基礎(chǔ)
Azure Arc為企業(yè)構(gòu)建安全的云基礎(chǔ)
隨著人工智能技術(shù)持續(xù)重塑企業(yè)運(yùn)營(yíng)方式,企業(yè)需要能夠處理海量數(shù)據(jù)的系統(tǒng),以支持實(shí)時(shí)洞察,同時(shí)幫助他們應(yīng)對(duì)跨IT和OT環(huán)境(包括云端、邊緣和本地)中運(yùn)營(yíng)、應(yīng)用、數(shù)據(jù)和基礎(chǔ)設(shè)施的協(xié)作難題。
Azure
微軟云
云服務(wù)
2024-12-172024-12-17
釋放.NET 9和Azure的AI技術(shù)與云計(jì)算潛力:更快、更智能、面向未來(lái)
釋放.NET 9和Azure的AI技術(shù)與云計(jì)算潛力:更快、更智能、面向未來(lái)
.NET 9現(xiàn)已正式發(fā)布,它為.NET平臺(tái)的發(fā)展掀開了嶄新的一頁(yè),突破了性能、云原生開發(fā)和AI技術(shù)集成的邊界。
Azure
微軟云
云服務(wù)
2024-12-162024-12-16
Azure網(wǎng)絡(luò)管理現(xiàn)已具備智能Microsoft Copilot副駕駛能力
Azure網(wǎng)絡(luò)管理現(xiàn)已具備智能Microsoft Copilot副駕駛能力
智能Microsoft Copilot副駕駛for Azure網(wǎng)絡(luò)服務(wù)現(xiàn)已推出公共預(yù)覽版。
Azure
微軟云
云服務(wù)
2024-12-102024-12-10
Microsoft Fabric功能更新,借助AI驅(qū)動(dòng)的數(shù)據(jù)平臺(tái)加速應(yīng)用創(chuàng)新
Microsoft Fabric功能更新,借助AI驅(qū)動(dòng)的數(shù)據(jù)平臺(tái)加速應(yīng)用創(chuàng)新
一年前,我們正式推出了一款端到端數(shù)據(jù)平臺(tái),旨在幫助組織推動(dòng)人工智能轉(zhuǎn)型,并重新定義數(shù)據(jù)的連接、管理和分析方式。
Azure
微軟云
云服務(wù)
2024-12-092024-12-09
優(yōu)質(zhì)服務(wù)商推薦
更多
掃碼登錄
打開掃一掃, 關(guān)注公眾號(hào)后即可登錄/注冊(cè)
加載中
二維碼已失效 請(qǐng)重試
刷新
賬號(hào)登錄/注冊(cè)
小程序
快出海小程序
公眾號(hào)
快出海公眾號(hào)
商務(wù)合作
商務(wù)合作
投稿采訪
投稿采訪
出海管家
出海管家