直接上代码
解析富文本工具类
public class RichTextUtils
{
/**
* 对富文本base64图片进行转换上传处理
* @param content
* @return
* @throws Exception
*/
public static string handlerBase64Content(string content, IWebHostEnvironment _environment)
{
string srcvalues = "";
if (!string.IsNullOrEmpty(content))
{
//获取src值
srcvalues = getImgSrc(content,_environment);
}
return srcvalues;
}
public static string getImgSrc(string content, IWebHostEnvironment _environment)
{
//List<string> list = new List<string>();
var doc = new HtmlDocument();
doc.LoadHtml(content);
// 查询所有的 img 元素节点
var imageNodes = doc.DocumentNode.SelectNodes("//img");
if (imageNodes != null)
{
foreach (var node in imageNodes)
{
string imgtext = node.GetAttributeValue("src", "");
string img = imgtext.Substring(imgtext.IndexOf(",") +1);
var newimg = Base64ToImage(img, _environment.WebRootPath, "测试");
content = content.Replace(imgtext, newimg);
//list.Add(newimg);
}
}
return content;
}
/// <param name="strbase64">64Base码</param>
/// <param name="path">保存路径</param>
/// <param name="filename">文件名称</param>
/// <returns></returns>
public static string Base64ToImage(string strbase64, string path, string filename)
{
string Flag = "false";
try
{
//base64编码的文本 转为 图片
//图片名称
byte[] arr = Convert.FromBase64String(strbase64);//将指定的字符串(它将二进制数据编码为 Base64 数字)转换为等效的 8 位无符号整数数组。
using (MemoryStream ms = new MemoryStream(arr))
{
Bitmap bmp = new Bitmap(ms);//加载图像
if (!Directory.Exists(path))//判断保存目录是否存在
{
Directory.CreateDirectory(path);
}
bmp.Save((path + "\\" + filename), System.Drawing.Imaging.ImageFormat.Jpeg);//将图片以JPEG格式保存在指定目录(可以选择其他图片格式)
ms.Close();//关闭流并释放
//上传文件至OSS
using (HttpClient client = new HttpClient())
{
var content = new MultipartFormDataContent();
content.Add(new ByteArrayContent(System.IO.File.ReadAllBytes(path + "\\" + filename)), "multipartFile", "123.png");
//这个地方可以调用写好的oss上传文件的接口 也可以自行实现上传oss文件 我这里直接用写好的
var requestUri = "https://xxxx.com/api/upload/upload";
var result = client.PostAsync(requestUri, content).Result.Content.ReadAsStringAsync().Result;
Flag = result;
}
//删除本地文件
if (File.Exists(path + "\\" + filename))//判断是否存在
{
File.Delete(path + "\\" + filename);
}
}
}
catch (Exception ex)
{
Flag = "error:" + ex.Message;
}
return Flag;
}
}
API控制器调用实现
#region 解析富文本框里base64图片进行转换上传
public async Task<ResponseViewModel<object>> getUrl([FromBody] content body)
{
try
{
var url = RichTextUtils.handlerBase64Content(body.contents,_environment);
return ResponseViewModel<object>.Create(Status.SUCCESS,Message.SUCCESS,url);
}
catch (Exception e)
{
throw;
}
}
#endregion
这样就可以解决存储大小的负担