关于富文本编辑器中将远程图片保存为本地文件的方法
- 2023-06-13
- 2021
- 飞驰的心
如果你看了上一篇文章,你就明白,其实这两个文章是姊妹篇,要实现两个就都要实现,因为这是联体问题,这个问题的危害可能更大,先不说你的内容点开以后可能要请求外部url的延迟问题,最要命的是如果你引用的网站关闭了,域名被黑产注册了,这时候你引用的图片可能会被黑产恶意的注入404,后果你自己想……
所以干咱们这一行的,挨打挨多了就得自己长记性,话不多说下面是实现代码:
//将富文本中的远程引用图片下载并保存,同时规范扩展名为指定格式 private string DownloadAndSaveImages(string richText) { // 匹配远程引用的图片 string pattern = @"]*src\s*=\s*['""](https?://.*?)['""][^>]*>"; Regex regex = new Regex(pattern, RegexOptions.IgnoreCase); // 设置保存图片的目录 string filePath = "/uploadfile/image/" + DateTime.Now.ToString("yyyyMM") + "/"; if (!Directory.Exists(filePath)) { Directory.CreateDirectory(Server.MapPath(filePath)); } // 匹配所有的远程引用图片 MatchCollection matches = regex.Matches(richText); int i = 0; foreach (Match match in matches) { string imageUrl = match.Groups[1].Value; try { // 下载图片并保存 using (WebClient webClient = new WebClient()) { byte[] imageBytes = webClient.DownloadData(imageUrl); string extension = GetImageExtension(imageBytes); string fileName = filePath + DateTime.Now.ToString("ddHHmmss") + "_" + (i++) + "." + extension; System.IO.File.WriteAllBytes(Server.MapPath(fileName), imageBytes); // 替换原始富文本中的img标签 richText = richText.Replace(match.Value, $"《img src="\" {filename}\""="">"); } } catch (Exception ex) { // 错误处理 // 这里可以根据需要进行日志记录、异常处理等操作 // 例如,可以替换为默认图片,跳过错误的图片等 Console.WriteLine($"Error downloading and saving image: {ex.Message}"); } } return richText; } private string GetImageExtension(byte[] imageBytes) { // 根据图片的实际内容判断扩展名 string extension = "png"; // 默认为PNG格式 // 检查图片的前几个字节来确定实际格式 if (imageBytes.Length > 3) { if (imageBytes[0] == 0xFF && imageBytes[1] == 0xD8 && imageBytes[2] == 0xFF) { extension = "jpg"; } else if (imageBytes[0] == 0x89 && imageBytes[1] == 0x50 && imageBytes[2] == 0x4E && imageBytes[3] == 0x47) { extension = "png"; } else if (imageBytes[0] == 0x47 && imageBytes[1] == 0x49 && imageBytes[2] == 0x46 && imageBytes[3] == 0x38) { extension = "gif"; } } return extension; }
问题不难解决的方法也同上面代码一致,主要就是分析富文本看看有没有http和https的src,如果有则先下载(下载完成得到本地路径后)替换原img的src中的远程路径。
本博客所有内容均为原创,原则上我不希望你转载。如特别喜欢而转载的话,请务必注明出处“网际飞扬 http://www.fayo.net”
否则本人闲来无事可能会把你误当成维权的靶子。
评论
全部评论
共{{commentCount}}条{{rs.Msg_Content}}