asp.net图片防盗链,另类解决url参数转码gb2312转码utf-8问题

有一个朋友的网站需要防盗链某个网站A的图片,因此在<img src="http://A.com/A.jpg">中需要替换成<img src="P.ashx?s=http://A.com/A.jpg">其中P.ashx是用来处理图片防盗链的,通过s参数get传递原网站A的图片地址,但是,A网站的编码为gb2313,而朋友的网站编码为utf-8(由于某种原因必须使用utf-8),偏偏A网站的图片有部分是有中文命名的图片。

P.ashx,之前是通过context.Request.QueryString["s"]来获取A网站的url的,导致在图片地址含有中文的时候,乱码导致图片不能正常读取。
 
因此,找到我,在我分析之后,换成如下方式,来获取A网站的图片地址:
string imgUrl = context.Request.Url.AbsoluteUri;
来替代
string imgUrl = context.Request.QueryString["s"];
 
来看代码吧:(是我修改之后的)
 
       public void ProcessRequest(HttpContext context)
        {
            if (!string.IsNullOrEmpty(context.Request.QueryString["s"]))
            {
                string imgUrl = context.Request.Url.AbsoluteUri;// context.Request.QueryString["s"];
 
                if (imgUrl.IndexOf("?s=") > 0)
                {
                    imgUrl = imgUrl.Substring(imgUrl.IndexOf("?s=") + 3);
                }
 
                if (imgUrl.IndexOf("?") > 0)
                {
                    imgUrl = imgUrl.Substring(0, imgUrl.IndexOf("?"));
                }
                else
                {
                    imgUrl = imgUrl.Replace("%3ftb%3ddm", "");
                }
 
                try
                {
                    //context.Response.Write(imgUrl);
                    System.Net.WebClient wc = new System.Net.WebClient();
                    wc.Headers.Add("Referer", imgUrl);//防止图片防盗链
                    byte[] bytes = wc.DownloadData(imgUrl); //读取远程图片数据
                    System.Drawing.Image image = System.Drawing.Image.FromStream(new System.IO.MemoryStream(bytes));  //将二进制转换为图片对象
                    //图片保存及输出
                    System.IO.MemoryStream ms = new System.IO.MemoryStream();
                    context.Response.ClearContent(); //需要输出图象信息 要修改HTTP头 
                    if (imgUrl.IndexOf(".gif") > 0)
                    {
                        image.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);
                        context.Response.ContentType = "image/gif";
                    }
                    else
                    {
                        image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
                        context.Response.ContentType = "image/jpeg";
                    }
                    context.Response.BinaryWrite(ms.ToArray());
                    ms.Close();
                    image.Dispose();
                    bytes = null;
 
                }
                catch (Exception e)
                {
                    context.Response.Write(e.ToString());
                    context.Response.End();
                }
            }
        }
评论 (0) 分享 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址