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

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