在后台涉及到有文章编辑的功能中,为了方便编辑使用,我们需要增加一个可以直接从别的网站拷贝过来保存的功能。这里面主要的是图片的处理问题,因为图片是别网站上的链接,这样的话就必须要换成自己本地的图片路径,这样的话就需要做一些处理才行。

    我的思路大概如下:(如果您有更好的想法,欢迎后面留言拍砖,谢绝人身攻击~~)

1、增加一个可以下载远程图片的选择

2、如果用户有勾选这个功能,就根据获取的文章内容,然后通过正则表达式获取所有img的src值组

3、循环整个src值组,如果其中有本地图片路径就不去下载,如果没有就去下载这个远程图片到本地

4、第3步中,在下载远程图片获取本地地址后,替换这个src中的值为下载后返回的图片路径

通过上面4个步骤就可以把整个文章内容的图片替换为自己本地下载后的路径,其中主要的2个步骤其实就是遇到不是本地图片路径的就去下载到本地,然后根据下载后返回的图片路径替换之前的图片路径。说了这么多,还是直接上代码为好(下面代码在实际项目中运行良好)

private string ArticleContentChange(string articleContent)
        {
            string Pattern_url = @"<img\b[^<>]*?\bsrc[\s\t\r\n]*=[\s\t\r\n]*[""']?[\s\t\r\n]*(?<imgUrl>[^\s\t\r\n""'<>]*)[^<>]*?/?[\s\t\r\n]*>";//匹配所有的img标签
            Regex reg_url = new Regex(Pattern_url, RegexOptions.IgnoreCase);
            MatchCollection colMatch_url = reg_url.Matches(articleContent);
            if (colMatch_url.Count > 0)
            {
                List<string> list = new List<string>();
                foreach (Match match_url in colMatch_url)
                {
                    string imgurl = match_url.Groups["imgUrl"].Value;//获取src中值
                    if (!imgurl.StartsWith("你要存储的本地图片地址", true, null))//这里只是做一个是否里面包含一些本地图片路径(具体情况根据个人项目不同)
                    {
                        string downloadimgurl = downloadImgFromUrl(imgurl);//下载远程图片
                        articleContent = articleContent.Replace(imgurl, downloadimgurl);
                    }
                }
            }
            return articleContent;
        }
    private string downloadImgFromUrl(string imgurl, Article a)
    {
        WebClient wc = new WebClient();
        if (!wc.IsBusy)
        {
            string url ="你要存储的本地图片路径";       
	    try
            {
                byte[] bytes = wc.DownloadData(new Uri(imgurl, UriKind.RelativeOrAbsolute));
                MemoryStream ms = new MemoryStream(bytes);
                System.Drawing.Image img = System.Drawing.Image.FromStream(ms);
                img.Save(Server.MapPath(url), ImageFormat.Jpeg);
            }
            catch (Exception)
            {
                wc.Dispose();
            }
            finally
            {
                wc.Dispose();
            }
            return url;
        }
        else{
            return "";
          }
}

 

标 签: 下载远程图片

暂无评论