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

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

一,引言

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

1,什么是Blob?

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

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

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

Azure Blob Storage存儲系列:

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

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

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

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非常適用于存儲日志或?qū)懭肓鲾?shù)據(jù)等方案。

3,page blob(頁blob):專用于涉及隨機(jī)存取讀寫的方案。頁blob用于存儲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)擊圖中圈起來的“Containers”,進(jìn)行創(chuàng)建容器

ia_5200000001.png

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

注意:這里的容器,我們可以理解為用來存儲對象的容器

ia_5200000002.png

Name:“picturecontainer”

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

點(diǎn)擊“Create"

ia_5200000003.png

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

ia_5200000004.png

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

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”(如果文件存儲,就覆蓋)

點(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)行操作的。接下來我們通過代碼進(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ù)庫鏈接字符串配置在項(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,我們啟動項(xiàng)目進(jìn)行測試

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

ia_5200000023.png

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

ia_5200000024.png

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

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

BlobExplorerController完整代碼

BlobExplorerController

IBlobSergvice接口類

IBlobSergvice

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

BlobService

UpLoadContentRequest

UpLoadContentRequest

UploadFileRequest

UploadFileRequest

FileExtensions擴(kuò)展類

FileExtensions

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

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

(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)槲覀冊谏蟼魑募性O(shè)置文件的請求頭的原因

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

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

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

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

三,結(jié)尾

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

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

作者:Allen

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

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

立即登錄,閱讀全文
版權(quán)說明:
本文內(nèi)容來自于Allen,本站不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。文章內(nèi)容系作者個(gè)人觀點(diǎn),不代表快出海對觀點(diǎn)贊同或支持。如有侵權(quán),請聯(lián)系管理員(zzx@kchuhai.com)刪除!
優(yōu)質(zhì)服務(wù)商推薦
更多
個(gè)人VIP