在业务当中需要将图片文件转为Base64:windows上可以运行正常执行,部署到Linux系统上报The type initializer for ‘Gdip‘ threw an exception
图片转Base64代码如下
/// <summary>
/// 图片转为base64编码的文本
/// </summary>
/// <param name="ImageFileName"></param>
/// <returns></returns>
public static string ImgPathNameToBase64String(string ImageFileName)
{
try
{
Bitmap bmp = new Bitmap(ImageFileName);//仅在 Windows 上支持 System.Drawing.Common。Linux系统会报错
MemoryStream ms = new MemoryStream();
bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
byte[] arr = new byte[ms.Length];
ms.Position = 0;
ms.Read(arr, 0, (int)ms.Length);
ms.Close();
String strBase64 = Convert.ToBase64String(arr);
return strBase64;
}
catch (Exception ex)
{
Console.WriteLine("图片转为base64编码的文本》异常:::" + ex);
return "";
}
}
/// <summary>
/// 图片转为base64编码的文本
/// </summary>
/// <param name="ImageFileName"></param>
/// <returns></returns>
public static string ImgToBase64String(Stream stream)
{
try
{
Bitmap bmp = new Bitmap(stream);//仅在 Windows 上支持 System.Drawing.Common。Linux系统会报错
MemoryStream ms = new MemoryStream();
bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
byte[] arr = new byte[ms.Length];
ms.Position = 0;
ms.Read(arr, 0, (int)ms.Length);
ms.Close();
String strBase64 = Convert.ToBase64String(arr);
return strBase64;
}
catch (Exception ex)
{
Console.WriteLine("图片转为base64编码的文本》异常:::" + ex);
return "";
}
}
搜索引擎上的文章解决方案:https://blog.csdn.net/u010476739/article/details/124317037
此文章中的问题与我的问题是相似的,由于我使用的是docker部署,我没有使用此解决方案;因为docker 容器与虚拟机很相似,容器类似于虚拟机,只是容器不是完整的操作系统,容器通常只包含必要的操作系统包和应用程序,这是它们的轻量级。不可能每次部署都往docker容器当中安装一些包,这样即增加部署时常(网络不好的情况下甚至会部署失败),还违反了容器的轻量级。如果各位网友不是使用容器化部署的话可以尝试使用此方案
在微软官方:https://learn.microsoft.com/zh-cn/dotnet/core/compatibility/core-libraries/6.0/system-drawing-common-windows-only
和另一个文章:https://blog.csdn.net/IT_rookie_newbie/article/details/126559363
这里表明System.Drawing.Common仅在 Windows 上支持
而我的方法当中有Bitmap bmp = new Bitmap() 是System.Drawing.Common类库的
Microsoft建议是替换类库
于是我换成FileStream fs = new FileStream()
到此问题解决了,代码如下
/// <summary>
/// 图片文件转换成Base64字符串
/// </summary>
/// <param name="fileName">文件绝对路径</param>
/// <returns></returns>
public static String ImgFileToBase64(string fileName)
{
try
{
FileStream fs = new FileStream(fileName, FileMode.Open);
byte[] bt = new byte[fs.Length];
fs.Read(bt, 0, bt.Length);
string strBase64 = Convert.ToBase64String(bt);
fs.Close();
return strBase64;
}
catch (Exception ex)
{
Console.WriteLine("图片文件转换成Base64字符串》异常:::" + ex);
return "";
}
}
!!!记录遇到的bug问题,为遇到类似问题,可查看文章,寻找排查问题解决思路