如何在 .net core 將圖片、檔案轉成 Base 64 字串

圖片取得 Hash:

首先 .net core 必須要引入 System.Draw.Common(參考:How do you use System.Drawing in .NET Core?),如此就可以使用 Image 接收 WinForm 傳入的圖檔。

Install-Package System.Drawing.Common -Version 4.5.1

 

Image to base64 string:

public static string ImageToBase64(Image image)
{
    using (MemoryStream ms = new MemoryStream())
    {
        image.Save(ms, image.RawFormat);
        byte[] bytesImage = ms.ToArray();
 
        return Convert.ToBase64String(bytesImage);
    }
}

針對 base64 產生 SHA256 特徵直:

public static string ComputeSha256(string base64)

{
    SHA256 sha256 = new SHA256CryptoServiceProvider();
    var hash = sha256.ComputeHash(Encoding.Default.GetBytes(base64));
 
    return Convert.ToBase64String(hash);
}

檔案類似,但直接讀取 file bytes 進行 Hash

 

比對方式:

傳入的圖片:同樣執行 圖片取得 Hash: 後,比對特徵值是否正確。

 

之後就可以利用特徵值進行簽章。不用 base64 string 的原因是因為圖片轉 base64 檔案大小其實跟原始圖片一樣大,因此可以不需要儲存圖片,只儲存特徵檔的方式處理。

 

另外也可以透過 base64 還原圖片與檔案,作法如下:

圖片還原:

public static Image Base64ToImage(string base64)
{
    byte[] bytesImage = Convert.FromBase64String(base64);
    using (MemoryStream ms = new MemoryStream(bytesImage, 0, bytesImage.Length))
    {
        ms.Write(bytesImage, 0, bytesImage.Length);
        return Image.FromStream(ms);
    }
}

檔案還原:

 

public static void Base64ToFile(string base64, string filepath)
{
    Byte[] bytes = Convert.FromBase64String(base64);
    File.WriteAllBytes(filepath, bytes);

}

 

建立 Winform Aspnetcore Signalr Client

首先要使用 .net framework 4.6.1 或以上版本,主因在於 asp.net core signalr 最低要求支援環境(這裡是使用 .net standard library)。

 

其次,在 Winform 因為有執行序的問題,因此,在 console 的範例呼叫方式:

_hub.StartAsync().Wait();

ConnectToHub().Wait();

 

在 winform 上會變成沒有回應(因為在等待 Wait() 執行完畢)。

正確做法是透過 Task.Run() 產生新的執行序:

Task.Run(() =>
{
_hub.StartAsync().Wait();

ConnectToHub().Wait();

});

 

但此時又會有無法存取 UI thread 的 controls(例如 textBox);因此必須要在 Form intialized 時候,加入:

CheckForIllegalCrossThreadCalls = false;

這代表不檢查控制項的安全執行緒呼叫,如此,就可以正確執行。

建立 .Net Standard Library

主要重點:透過 .net standard library 可以提供給 .net core and .net framework 的專案使用

簡化維護兩套的困難。

依據微軟的架構, .net standard 是作為各個 framework 底層使用:

因此,我們在維護共享元件時候,只有選擇 .net standard 才可以給各個平台架構所使用。

建立方式很簡單,直接在【新增專案】中選擇 .net standard 即可: