绝大多数网站都不希望自己网站中的资源被其他网站或者下载程序引用,在C#.net中可以利用App_Data文件夹来实现下载文件及图片文件的防盗链功能。
原理一:在Asp.net中App_Data文件夹包含应用程序的本地数据存储。它通常以文件(诸如Microsoft Access或Microsoft SQL Server Express数据库、XML文件、文本文件以及应用程序支持的任何其他文件)形式包含数据存储。该文件夹内容不由Asp.net处理,也就是说浏览者无法直接访问此文件夹,因此我们可以利用这一权限特性来实现防盗链。
原理二:对来访请求地址进行核查,如果为非授权地址,刚转到防盗链页面。
原理三: System.IO 命名空间包含允许读写文件和数据流的类型以及提供基本文件和目录支持的类型。其中 FileStream 类是对文件系统上的文件进行读取、写入、打开和关闭操作,并对其他与文件相关的操作系统句柄进行操作。FileStream 可以对输入输出进行缓冲,从而达到操作大文件的目的。
首先我们把下载文件与图片文件放在App_Data文件夹中(建议建立子文件夹分别存放)。
在文件GetFile.aspx中写入地址核查代码:
string Validstr = "qhdedu.net,qhdedu.com";
       string[] domainName = Validstr.ToLower().Split(new char[] { ',' });
string referrer = Request.UrlReferrer.ToString().ToLower();
foreach (string strtmp in domainName)
            {  if (referrer.IndexOf(strtmp.ToLower()) > 0)
                {
//此处写下载代码

else
                { Response.Redirect("Error.htm", true);}//来访地址不合法,转向错误页
                }
其中变量Validstr为允许的访问来源,如果有多个则用半角的","分割,并将它分割成数组domainName,来访地址referrer与数组中的各元素进行对比,如果存在,则表示地址合法,如果不存在,视为地址不合法,刚转向错误页。
     根据服务器的配置,IIS 进程可能会处理数据,也可能会将数据缓存在内存中。如果文件太大,在这两个进程相互通信的过程中,数据将被缓存在内存中。这可能会导致服务器上的内存使用量急剧增加,由于Web服务器上的内存限制而产生错误。因此我们要将数据分成多段较小的部分,然后将其移动到输出流以供下载,从而使用客户端获取文件数据。
以下为下载文件代码:
        System.IO.Stream iStream = null;
        byte[] buffer = new Byte[10000];
        int length;
        long dataToRead;
        string filename = System.IO.Path.GetFileName(Downfile);
        iStream = new System.IO.FileStream(downfile, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.Read);
        dataToRead = iStream.Length;
        Response.ContentType = "application/octet-stream";
        Response.AddHeader("Content-Disposition", "attachment; filename=" + filename);
        while (dataToRead > 0)
            {if (Response.IsClientConnected)
                {length = iStream.Read(buffer, 0, 10000);
                 Response.OutputStream.Write(buffer, 0, length);
                 Response.Flush();
                 buffer = new Byte[10000];
                 dataToRead = dataToRead - length;
                }
               else
                {dataToRead = -1; }
            }
如果是显示图片文件,则可用以下代码实现:
string fileName = Server.MapPath("App_Data\\" + Downfile);
      HttpContext.Current.Response.ContentType = "image/JPEG";
      HttpContext.Current.Response.WriteFile(fileName);
其中Downfile为存放于App_Data目录中的图片文件名称或下载文件名称。当然在代码中开发者可以自己需求加入适当的设置,如:是否可以盗链,是否产生随机下载文件名等。
在具体页面中通过给GetFile.aspx传递一定参数即可实现下载文件与显示图片,如在Default.aspx中加入以下代码:
<a href='<%="GetFile.aspx?Lb=File&Downfile=" + Server.UrlEncode("EDU.rar") %>'>测试下载</a>
<img src="<%="GetFile.aspx?Lb=Img&Downfile=EDULOGO.jpg" %>" alt="图片测试"  />
其中Lb表示是下载文件,还是显示图片。
再建立一个错误转向页Error.htm:
<body>
<b style="color:red;">对不起,本站不允许盗链</b>
<a href="http://www.5iadmin.com/" target="_blank" title="网管小王">返回首页</a>
</body>

文章如转载,请注明转载自:http://www.5iadmin.com/post/733.html