ASP.NET 2.0 文件下载(支持大文件、防盗链)

1.文件下载
HTTP 文件下载主要有两种方式:

URL方式直接下载,优点是:占用服务器资源少,速度快;缺点是: 不能准确计量下载次数,无法防止盗链,保存在数据库中的文件无法下载,常见格式的文件如.html 直接在浏览器中打开,不能直接下载。
二进制数据流输出方式,优点是:准确计量下载次数、能防盗链、所有文件格式都能直接下载而不是打开、保存在数据库中等非文件数据能以文件方式下载等;缺点是占用服务器资源多。
大文件下载原理是把文件切成小段数据流下载,微软msdn给出了大文件下载的示例,但存在中文文件名乱码问题,稍加改动即可。代码为:
01. protected void ResponseFile(string path) {
02.     System.IO.Stream iStream = null;
03.     byte[] buffer = new Byte[10000];
04.     int length;
05.     long dataToRead;
06.     string filename = System.IO.Path.GetFileName(path);
07.   
08.     try {
09.         iStream = new System.IO.FileStream(path, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.Read);
10.         dataToRead = iStream.Length;
11.         Response.ContentType = "application/octet-stream";
12.         Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(filename, System.Text.Encoding.UTF8));
13.         while (dataToRead > 0) {
14.             if (Response.IsClientConnected) {
15.                 length = iStream.Read(buffer, 0, 10000);
16.                 Response.OutputStream.Write(buffer, 0, length);
17.                 Response.Flush();
18.                 buffer = new Byte[10000];
19.                 dataToRead = dataToRead - length;
20.                 }
21.             else {
22.                 dataToRead = -1;
23.                 }
24.             }
25.         }
26.     catch (Exception ex) {
27.         Response.Write("文件下载时出现错误!");
28.         }
29.         finally {
30.             if (iStream != null) {
31.                 iStream.Close();
32.                 }
33.             }
34.         }
protected void ResponseFile(string path) {<br/> System.IO.Stream iStream = null;<br/> byte[] buffer = new Byte[10000];<br/> int length;<br/> long dataToRead;<br/> string filename = System.IO.Path.GetFileName(path);<br/><br/> try {<br/> iStream = new System.IO.FileStream(path, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.Read);<br/> dataToRead = iStream.Length;<br/> Response.ContentType = "application/octet-stream";<br/> Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(filename, System.Text.Encoding.UTF8));<br/> while (dataToRead > 0) {<br/> if (Response.IsClientConnected) {<br/> length = iStream.Read(buffer, 0, 10000);<br/> Response.OutputStream.Write(buffer, 0, length);<br/> Response.Flush();<br/> buffer = new Byte[10000];<br/> dataToRead = dataToRead - length;<br/> }<br/> else {<br/> dataToRead = -1;<br/> }<br/> }<br/> }<br/> catch (Exception ex) {<br/> Response.Write("文件下载时出现错误!");<br/> }<br/> finally {<br/> if (iStream != null) {<br/> iStream.Close();<br/> }<br/> }<br/> }
2.防止盗链
01. protected void Page_Load(object sender, EventArgs e) {
02.     /*-------------大文件下载,防盗链------------------*/
03.     if (Request.QueryString["FileName"] == null) { InvalidRedirect(); }
04.     string fileName = Request.QueryString["FileName"];
05.     if (fileName == string.Empty) { InvalidRedirect(); }
06.     //判断配置文件是否直接下载
07.     string downDirect = ConfigurationManager.AppSettings["Down"].ToLower();
08.     if (downDirect == "true") { UpdateHits(fileName);
09.     //更新下载次数 Response.Redirect("Upload/" + fileName);  return; }
10.     string path = Server.MapPath(Request.ApplicationPath + "/Upload/" + fileName);
11.     string referrer = string.Empty;
12.     if (Request.UrlReferrer != null) { referrer = Request.UrlReferrer.ToString().ToLower(); }
13.     string d = ConfigurationManager.AppSettings["Valid"].ToLower();
14.     string[] domainName = ConfigurationManager.AppSettings["Refers"].ToLower().Split(new char[] { ',' });
15.     // 如果设置为防止盗链,判断访问来源是否合法
16.     if (d == "false") {
17.         foreach (string s in domainName) {
18.             if (referrer.IndexOf(s.ToLower()) > 0) { UpdateHits(fileName);
19.             //更新下载次数
20.             ResponseFile(path);
21.             return;
22.             }
23.             }
24.         InvalidRedirect();
25.         }
26.         else {
27.             ResponseFile(path);
28.             }
29.         }
30.     protected void UpdateHits(string fileName) {
31.         //更新文件下载次数的代码
32.         }
33.     protected void InvalidRedirect() {
34.         string defaultPage = ConfigurationManager.AppSettings["DefaultRedirect"];
35.         Response.Redirect(defaultPage, true);
36.         }
protected void Page_Load(object sender, EventArgs e) {<br/> /*-------------大文件下载,防盗链------------------*/<br/> if (Request.QueryString["FileName"] == null) { InvalidRedirect(); }<br/> string fileName = Request.QueryString["FileName"];<br/> if (fileName == string.Empty) { InvalidRedirect(); }<br/> //判断配置文件是否直接下载<br/> string downDirect = ConfigurationManager.AppSettings["Down"].ToLower();<br/> if (downDirect == "true") { UpdateHits(fileName);<br/> //更新下载次数 Response.Redirect("Upload/" + fileName); return; }<br/> string path = Server.MapPath(Request.ApplicationPath + "/Upload/" + fileName);<br/> string referrer = string.Empty;<br/> if (Request.UrlReferrer != null) { referrer = Request.UrlReferrer.ToString().ToLower(); }<br/> string d = ConfigurationManager.AppSettings["Valid"].ToLower();<br/> string[] domainName = ConfigurationManager.AppSettings["Refers"].ToLower().Split(new char[] { ',' });<br/> // 如果设置为防止盗链,判断访问来源是否合法<br/> if (d == "false") {<br/> foreach (string s in domainName) {<br/> if (referrer.IndexOf(s.ToLower()) > 0) { UpdateHits(fileName);<br/> //更新下载次数<br/> ResponseFile(path);<br/> return;<br/> }<br/> }<br/> InvalidRedirect();<br/> }<br/> else {<br/> ResponseFile(path);<br/> }<br/> }<br/> protected void UpdateHits(string fileName) {<br/> //更新文件下载次数的代码<br/> }<br/> protected void InvalidRedirect() {<br/> string defaultPage = ConfigurationManager.AppSettings["DefaultRedirect"];<br/> Response.Redirect(defaultPage, true);<br/> }
3.配置文件
配置文件中配置下载方式、盗链功能是否开启及盗链默认转向的页面地址:
01. <appSettings>
02.     <add key="Down" value="false"/>
03.     <!--是否直接下载-->
04.     <add key="Valid" value="false"/>
05.     <!--是否允许盗链-->
06.     <add key="Refers" value="localhost,google.cn"/>
07.     <!--多个允许的访问来源用半角的","分割-->
08.     <add key="DefaultRedirect" value="Error.htm"/>
09.     <!--默认转向的页面-->
10. </appSettings>
<appSettings><br/> <add key="Down" value="false"/><br/> <!--是否直接下载--><br/> <add key="Valid" value="false"/><br/> <!--是否允许盗链--><br/> <add key="Refers" value="localhost,google.cn"/><br/> <!--多个允许的访问来源用半角的","分割--><br/> <add key="DefaultRedirect" value="Error.htm"/><br/> <!--默认转向的页面--><br/></appSettings>

转载于:https://www.cnblogs.com/interdrp/archive/2009/05/08/1452909.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
导言 创建一个数据访问层 创建一个业务逻辑层 母板页和站点导航 基本报表 使用ObjectDataSource展现数据 声明参数 编程设置ObjectDataSource的参数值 主/从 使用DropDownList过滤的主/从报表 使用两个DropDownList过滤的主/从报表 跨页面的主/从报表 使用GridView 和DetailView实现的主/从报表 自定义格式化 基于数据的自定义格式化 在GridView控件中使用TemplateField 在DetailsView控件中使用TemplateField 使用FormView 的模板 在GridView的页脚中显示统计信息 编辑插入和删除数据 概述插入、更新和删除数据 研究插入、更新和删除的关联事件 在ASP.NET页面中处理BLL/DAL层的异常 给编辑和新增界面增加验证控件 定制数据修改界面 实现开放式并发 为删除数据添加客户端确认 基于用户对修改数据进行限制 分页和排序 分页和排序报表数据 大数据量时提高分页的效率 排序自定义分页数据 创建自定义排序用户界面 自定义按钮行为 GridView里的Button 使用DataList和Repeater显示数据 用DataList和Repeater来显示数据 格式化DataList和Repeater的数据 使用DataList来一行显示多条记录 数据控件的嵌套 使用DataList和Repeater过滤数据 使用DropDownList过滤的主/从报表 跨页面的主/从报表 使用Repeater和DataList实现的主/从报表 使用DataList编辑和删除数据 综叙:在DataList里编辑和删除数据 批量更新 处理BLL和DAL的异常 在编辑和插入界面里添加验证控件 自定义DataList编辑界面 实现开放式并发 为删除数据添加客户端确认 基于用户对修改数据进行限制 DataList和Repeater的分页和排序 DataList和Repeater数据分页 DataList和Repeater数据排序(一) DataList和Repeater数据排序(二) DataList和Repeater数据排序(三) DataList和Repeater的自定义按钮行为 DataList和Repeater里的自定义button 从ASP.NET页面直接访问数据库 47 使用SqlDataSource 控件查询数据(Reeezak) 48 在SqlDataSource中使用参数化查询(Reeezak) 49 使用SqlDataSource插入、更新以及删除数据(Reeezak
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值