网站优化研究之图像资源网站优化矢量图形下载站优化 之 图形防盗链 以及 缓存图像数据,节省硬盘IO

各位程序员,你们好. 很久没有写文章. 上google 一看,发现我的写的文章,被copy转载的很严重.
如google: 木马技术研究   并且还不写出处,作者未知.

 

特此在文章开始本人声明:
如有转载必须带上出处: 阿呆 - 音乐是流动的字符,字符是沉睡的阿呆( http://blog.youkuaiyun.com/davemin/ )

然, 无论如何可以说明我写的东东还有些价值,因此本人就以前没有写完整的技术点, 补充说明.
本文属于补充 GDI+实例教程 技术相关在网站中的一点应用.
GDI+实例教程: http://blog.youkuaiyun.com/davemin/category/217235.aspx


1. 问题: 以巨量图像作为资源的图像网站, 如何维持网站自身的价值, 以及提高网站性能
示例网站A: http://www.logospace.cn 矢量标志下载_LOGO_矢量图形下载_书法字体 - 标志空间 ( 始于2006 )
示例网站B: tucoo 图库 ( 始于2001, google 图库可以知道url ) 等国内众多主流技术实现的网站.
不举国外的例子了.
(声明: 如本人对图库等站只是实事求是说事,并无攻击,反对,胡说,绯傍等等反面意思. 本人所说都是本人实际查实之事.
并希望我的技术研究,能为这些网站提供一定技术参考.
声明:本人并没有对示例网站A作推广宣传等,也没有攻击,反对,胡说,绯傍等等反面意思, 更没有泄露网站机密等情况.本人所说都是本人实际查实之事)


这两个类型站提供的内容有相同之处, 都是提供以图象为资源的内容.
大家先随便用用这两个网站会发现:

 

宣传: VC10年技术QQ群: 30107096 (欢迎VC资深程序员加入,本群只讨论VC技术)

 

 

以下几点, 对于国内众多主流技术实现的网站:
A. 图库上的图像是绝对地址, 如果程序员写程序,可以随时下载下来.
   图像相对应的矢量资源, 往往也是直接地址, 或者是zip 格式的地址, 图库网上确实有加密码. 其实这一些对于程序员来说, 太简单.
   只需要写一个程序完全可以全部下下来.全部解开. 不消X天时间,可以取到X.

B. 图像地址不能随时灵活更换.

C. 甚至可以使用穷举/猜测/sniff 等等技术,得知没有权限下载的图像的地址,而能直接下载
   本人见过国内很多艺术品相关网站,有此通病. 相关网站对重要图像也加上flash 等查看方式以限制权限.然本人以为无效.

   原因是: 图像就放在网站www目录下面.

D. 图像资源丰富, 流量较大, 导至服务器经常性读取图像
   图像文件基本上都比较小, 如: 1K - 100K 之间.  数量巨大.

   从性能以及计算机的角度来看, 这是非常浪费硬盘的. 本人就是有过这种经历, 一只服务器硬盘坏道无限多.

E. 就是防盗图象的工作.

 

 

2. 建议采用的方法


A. 所有图象等资源都放到网站www 目录之外, 目录结构可以这样:
   F:/MyWebsite
   F:/MyWebsite/Data/   放数据
   F:/MyWebsite/Data/Image/   放图像 
   F:/MyWebsite/Data/Image/Ai   放Ai格式图像
   F:/MyWebsite/Data/Image/Ai/200809  放2008.09月的Ai格式图像
   F:/MyWebsite/www/   放网站

   这样可以避免 穷举/猜测/sniff 等等技术,得知没有权限下载的图像的地址, 资源安全性提高了.

 

B. 图像采用简接导出

   如: image.aspx?id=0809000001

   监于对google,baidu等的友好, 可以使用urlrewrite 技术实现 url 为: image/0809000001/image.jpg 这样的形式
   对SEO 是大有好处的. 感觉像直接地址. 其实还是: image.aspx?id=0809000001 地址.
  

C. 图象防盗链
   C.1. 只许可本网站使用
   以Asp.Net为例: Request.UrlReferrer.AbsoluteUri 是否存在本站的域名,就可以知道是不是在本站打开这个图的.


   C.2. 许可直接打开
   以Asp.Net为例: Request.UrlReferrer.AbsoluteUri 为空的情况便是

   如果是其他情况打开,可以在图像上增加画上如: 本图像出处XXX图这样的文字.


D. 使用IIS缓存,缓存图象数据, 减少节省硬盘IO开支
   以Asp.Net为例: HttpRuntime.Cache.Insert, HttpRuntime.Cache.Remove 可以操作缓存

   缓存key 可以设置为: 绝对路径或者是相对路径, 缓存数据为图像文件的byte[]数据. 缓存时间可以为数小时.


E. 反程序无限下载,可以写代码限止10分钟内下载量>5等这样的情况. 以及需要输入验证码都是可以考虑的.

 

 

 

3. 本人设计的相关asp.net C#代码参考


下面这个API 为根据图像路径得到图像数据. 如果有缓存,从缓存中得,如果没有那么从硬盘得到,并加入缓存

  1.    public static byte[] Find( string imagePath )
  2.   {
  3.    string key = "IS_" + imagePath.ToLower();
  4.    object obj = HttpRuntime.Cache[ key ];
  5.    ifnull == obj )
  6.    {
  7.     if( !File.Exists( imagePath ) )
  8.      return null;
  9.     FileStream fileStream = File.OpenRead( imagePath );
  10.     if( fileStream.Length == 0 )
  11.     {
  12.      fileStream.Close();
  13.      return null;
  14.     }
  15.     byte[] data = new byte[ fileStream.Length ];
  16.     fileStream.Read( data, 0, data.Length );
  17.     fileStream.Close();
  18.     HttpRuntime.Cache.Insert( key, data, , DateTime.Now.AddMinutes( 60 ), TimeSpan.Zero );
  19.     return data;
  20.    }
  21.    return (byte[]) obj;
  22.   }

下面这个API, 断定是不是需要防盗


  1.   public static bool IsSpam(Page page)
  2.   {
  3.    string referrer = "";
  4.    ifnull != page.Request.UrlReferrer )
  5.    {
  6.     referrer = page.Request.UrlReferrer.AbsoluteUri;
  7.    }
  8.    referrer = referrer.ToLower();
  9.    bool isSpam = false;
  10. #if DEBUG
  11.    if( referrer.IndexOf( "localhost/mywebsite" ) == -1 )
  12.     isSpam = true;
  13. #else
  14.    if( referrer.IndexOf( "mywebsite" ) == -1 )
  15.     isSpam = true;
  16. #endif
  17.    return isSpam;
  18.   }

 

导出页可以使用如下代码: (当然导出页需要先写好header,Response.ContentType等)

  1.    if( !IsSpam(page) )
  2.    {
  3.     page.Response.OutputStream.Write( data, 0, data.Length );
  4.     return;
  5.    }
  6.    // convert data to bitmap
  7.    MemoryStream s = new MemoryStream( data );
  8.    Bitmap bmp = new Bitmap( s );
  9.    Bitmap bitmap = DrawSpamImage( ref bmp );
  10.    bmp.Dispose();

 

DrawSpamImage API实现参考:
Bitmap bitmap = new Bitmap( bmp.Width, bmp.Height ); //建立空图像
Graphics g = Graphics.FromImage( bitmap );//得到graphics, 然后可以随写画了. 可以先画上原图,再画上: 本图像出处XXX图这样的文字.

 


本人了解国内大多网站并没有采用这些技术中的一种或者多种,不管这些网站是asp.net实现还是asp或其他实现.
然,还是有极少部分网站有采用这些技术,如前面提到 示例网站A LOGO资源站 http://www.logospace.cn
程序员可以参考这个站的一些实现.

宣传: VC10年技术QQ群: 30107096 (欢迎VC资深程序员加入,本群只讨论VC技术)

本文出自:阿呆( http://blog.youkuaiyun.com/davemin/ )
时间:2008-09-10


 

下载方式:https://pan.quark.cn/s/a4b39357ea24 布线问题(分支限界算法)是计算机科学和电子工程领域中一个广为人知的议题,它主要探讨如何在印刷电路板上定位两个节点间最短的连接路径。 在这一议题中,电路板被构建为一个包含 n×m 个方格的矩阵,每个方格能够被界定为可通行或不可通行,其核心任务是定位从初始点到最终点的最短路径。 分支限界算法是处理布线问题的一种常用策略。 该算法与回溯法有相似之处,但存在差异,分支限界法仅需获取满足约束条件的一个最优路径,并按照广度优先或最小成本优先的原则来探索解空间树。 树 T 被构建为子集树或排列树,在探索过程中,每个节点仅被赋予一次成为扩展节点的机会,且会一次性生成其全部子节点。 针对布线问题的解决,队列式分支限界法可以被采用。 从起始位置 a 出发,将其设定为首个扩展节点,并将与该扩展节点相邻且可通行的方格加入至活跃节点队列中,将这些方格标记为 1,即从起始方格 a 到这些方格的距离为 1。 随后,从活跃节点队列中提取队首节点作为下一个扩展节点,并将与当前扩展节点相邻且未标记的方格标记为 2,随后将这些方格存入活跃节点队列。 这一过程将持续进行,直至算法探测到目标方格 b 或活跃节点队列为空。 在实现上述算法时,必须定义一个类 Position 来表征电路板上方格的位置,其成员 row 和 col 分别指示方格所在的行和列。 在方格位置上,布线能够沿右、下、左、上四个方向展开。 这四个方向的移动分别被记为 0、1、2、3。 下述表格中,offset[i].row 和 offset[i].col(i=0,1,2,3)分别提供了沿这四个方向前进 1 步相对于当前方格的相对位移。 在 Java 编程语言中,可以使用二维数组...
源码来自:https://pan.quark.cn/s/a4b39357ea24 在VC++开发过程中,对话框(CDialog)作为典型的用户界面组件,承担着与用户进行信息交互的重要角色。 在VS2008SP1的开发环境中,常常需要满足为对话框配置个性化背景图片的需求,以此来优化用户的操作体验。 本案例将系统性地阐述在CDialog框架下如何达成这一功能。 首先,需要在资源设计工具中构建一个新的对话框资源。 具体操作是在Visual Studio平台中,进入资源视图(Resource View)界面,定位到对话框(Dialog)分支,通过右键选择“插入对话框”(Insert Dialog)选项。 完成对话框内控件的布局设计后,对对话框资源进行保存。 随后,将着手进行背景图片的载入工作。 通常有两种主要的技术路径:1. **运用位图控件(CStatic)**:在对话框界面中嵌入一个CStatic控件,并将其属性设置为BST_OWNERDRAW,从而具备自主控制绘制过程的权限。 在对话框的类定义中,需要重写OnPaint()函数,负责调用图片资源并借助CDC对象将其渲染到对话框表面。 此外,必须合理处理WM_CTLCOLORSTATIC消息,确保背景图片的展示不会受到其他界面元素的干扰。 ```cppvoid CMyDialog::OnPaint(){ CPaintDC dc(this); // 生成设备上下文对象 CBitmap bitmap; bitmap.LoadBitmap(IDC_BITMAP_BACKGROUND); // 获取背景图片资源 CDC memDC; memDC.CreateCompatibleDC(&dc); CBitmap* pOldBitmap = m...
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值