c# .net中如何实现图片防盗链功能的代码实例

c# .net中如何实现图片防盗链功能的代码实例
原理一:在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.3ppt.com" target="_blank" title="IT泡泡堂">返回首页</a>
</body>

转载于:https://my.oschina.net/u/126154/blog/15802

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值