C#编程之.net中如何实现图片防盗链功能的代码实例
白羽 2018-07-10 来源 :网络 阅读 1292 评论 0

摘要:本文将带你了解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="//www.3ppt.com" target="_blank" title="IT泡泡堂">返回首页</a>
</body>

 

 


以上就介绍了C#.NET的相关知识,希望对C#.NET有兴趣的朋友有所帮助。了解更多内容,请关注职坐标编程语言C#.NET频道!


本文由 @白羽 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程