网际飞扬

还记得年少时的梦么,醒不过来 便信以为真……

主题背景
本网站首发版本创建于1999年4月
网际飞扬
手机网站二维码

请使用手机扫描二维码,登录网站手机版。

关于富文本编辑器中将远程图片保存为本地文件的方法

  • 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}}条
  • {{i+1}}楼
    {{rs.Msg_Sender}}{{rs.Msg_Datetime}}

    {{rs.Msg_Content}}

播放器封面
  • 宠物精灵