关于富文本编辑器中将远程图片保存为本地文件的方法
- 2023-06-13
- 2203
- 飞驰的心
如果你看了上一篇文章,你就明白,其实这两个文章是姊妹篇,要实现两个就都要实现,因为这是联体问题,这个问题的危害可能更大,先不说你的内容点开以后可能要请求外部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}}