日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

ASP.NET Core在Docker下面生成简易验证码

發布時間:2023/12/4 asp.net 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ASP.NET Core在Docker下面生成简易验证码 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

背景

驗證碼這個功能是十分常見的,各大系統的登錄頁面都會有。今天介紹一下最為普通的驗證碼。

無論最終給到前端的是圖片格式的驗證碼還是base64格式的驗證碼,其實都離不開這樣的一步操作,都要先在后臺生成一個圖片。

就個人經驗來說,早期的.NET Core想在Linux/Docker下面搞圖片這些還是相對麻煩一些的,首先是組件這一塊,其次是依賴這一塊。

不過,現在方便多了。

下面就基于ImageSharp這個組件來實踐一下。

準備工作

  • 安裝相應的nuget包

  • <ItemGroup><PackageReference?Include="SixLabors.ImageSharp"?Version="1.0.0-beta0007"?/><PackageReference?Include="SixLabors.Fonts"?Version="1.0.0-beta0009"?/><PackageReference?Include="SixLabors.ImageSharp.Drawing"?Version="1.0.0-beta0007"?/> </ItemGroup>

    需要注意的是,ImageSharp目前還不是正式版。

  • 準備一下字體文件

  • 示例用的是comic.ttf,這個只有240kb,算是比較小的了。

    這里選一個小一點的字體是因為不想讓打包好的鏡像太大,如果各位大佬有更小體積的字體可以告訴我一下哈。

    編碼實現

    首先是生成隨機數,應該不用說太多,如果先生成完成不一樣的數字或字母,自由控制就好。

    private?static?string?GenCode(int?num) {var?code?=?string.Empty;var?r?=?new?Random();for?(int?i?=?0;?i?<?num;?i++){code?+=?Chars[r.Next(Chars.Length)].ToString();}return?code; }

    然后就是生成的核心代碼了。

    private?static?readonly?Color[]?Colors?=?{?Color.Black,?Color.Red,?...?}; private?static?readonly?char[]?Chars?=?{?'0',?....?}; private?static?readonly?int?Width?=?90; private?static?readonly?int?Height?=?35;public?static?(string?code,?byte[]?bytes)?GenVCode(int?num) {var?code?=?GenCode(num);var?r?=?new?Random();using?var?image?=?new?Image<Rgba32>(Width,?Height);//?字體var?font?=?SystemFonts.CreateFont(SystemFonts.Families.First().Name,?25,?FontStyle.Bold);image.Mutate(ctx?=>{//?白底背景ctx.Fill(Color.White);//?畫驗證碼for?(int?i?=?0;?i?<?code.Length;?i++){ctx.DrawText(code[i].ToString(),?font,?Colors[r.Next(Colors.Length)],?new?PointF(20?*?i?+?10,?r.Next(2,?12)));}//?畫干擾線for?(int?i?=?0;?i?<?10;?i++){var?pen?=?new?Pen(Colors[r.Next(Colors.Length)],?1);var?p1?=?new?PointF(r.Next(Width),?r.Next(Height));var?p2?=?new?PointF(r.Next(Width),?r.Next(Height));ctx.DrawLines(pen,?p1,?p2);}//?畫噪點for?(int?i?=?0;?i?<?80;?i++){var?pen?=?new?Pen(Colors[r.Next(Colors.Length)],?1);var?p1?=?new?PointF(r.Next(Width),?r.Next(Height));var?p2?=?new?PointF(p1.X?+?1f,?p1.Y?+?1f);ctx.DrawLines(pen,?p1,?p2);}});using?var?ms?=?new?System.IO.MemoryStream();//?gif?格式image.SaveAsGif(ms);return?(code,?ms.ToArray()); }

    都是中規中矩的代碼,這里需要注意下面幾個地方:

  • 關于字體,這里取的是當前系統的第一個,如果系統一個字體都沒有,那肯定是拋異常的。正常的.net core的docker鏡像是沒有的,所以這也是為什么我們在前面要準備字體的原因。

  • Fill、DrawText、DrawLines這三個畫圖的方法大家看看說明就可以了

  • 對于生成格式,老黃這里用的是Gif,它支持Bmp,Gif,Jpeg,Png還有Base64,大家可以按需選擇,這里建議用Gif或Jpeg,因為生成的圖片會比較小,2.5kb左右。

  • 最后就是調用了。

    [HttpGet] public?IActionResult?GetCode() {var?(code,?bytes)?=?VCodeHelper.GenVCode(4);//?code?handle?logicSystem.Console.WriteLine(code);return?File(bytes,?"image/gif"); }

    Dockerfile

    簡單修改一下Dockerfile,加一句復制字體的命令。

    FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base WORKDIR /app EXPOSE 80# 復制字體到 /usr/share/fonts 目錄 COPY ./comic.ttf /usr/share/fonts/comic.ttfFROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build WORKDIR /src COPY . . RUN dotnet restore "VCodeTest.sln" WORKDIR /src/VCodeTest RUN dotnet build "VCodeTest.csproj" -c Release -o /app/buildFROM build AS publish RUN dotnet publish "VCodeTest.csproj" -c Release -o /app/publishFROM base AS final WORKDIR /app COPY --from=publish /app/publish . ENTRYPOINT ["dotnet", "VCodeTest.dll"]

    效果

    生成鏡像,運行效果如下:

    文中的示例代碼可以在我的github找到:

    https://github.com/catcherwong-archive/2020/tree/master/05/VCodeTest

    小結

    ImageSharp 這個組件用起來還是挺舒服的,大家可以嘗試嘗試。

    總結

    以上是生活随笔為你收集整理的ASP.NET Core在Docker下面生成简易验证码的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。