再问:如何禁止用户通过地址栏直接敲入url下载文件?
比如某个文件是xxx.rar,放在网站xxxweb目录filestore下,用户正常是可以通过在地址栏键入以下url地址下载的:   
 http://xxxWeb/filestore/xxx.rar   
 如果禁止? 
 我的想法是让用户只能在指定的aspx网页里下载。   
 -------------------------------------------- 
 已知的一种方案是把那个xxx.rar文件放到非web的目录下。然后用程序读取那个文件,再输出。   
 上面这种方案如何做? 
 如果要通过在服务器上设置非web目录,例如c;\temp,是不是得通过服务器管理员?如果部署在收费的互联网虚拟主机上,估计没有商家会开放这样的目录权限吧。
------解决方案--------------------帮顶一下。
------解决方案--------------------自己做一个下载类。然后调用,并且,可以将文件存放在网站所在目录以外,以防止类似的事情发生。   
 这个是在网络上较好的一个: 
 using System; 
 using System.Data; 
 using System.Configuration; 
 using System.Web; 
 using System.Web.Security; 
 using System.Web.UI; 
 using System.Web.UI.WebControls; 
 using System.Web.UI.WebControls.WebParts; 
 using System.Web.UI.HtmlControls; 
 using System.IO; 
 using System.Threading;   
 ///  <summary>  
 /// FileDownload 的摘要说明 
 ///  </summary>  
 public class FileDownload 
 { 
     ///  <summary>  
     /// 输出硬盘文件,提供下载 支持大文件、续传、速度限制、资源占用小 
     ///  </summary>  
     ///  <param name= "_Request "> Page.Request对象 </param>  
     ///  <param name= "_Response "> Page.Response对象 </param>  
     ///  <param name= "_fileName "> 下载文件名 </param>  
     ///  <param name= "_fullPath "> 带文件名下载路径 </param>  
     ///  <param name= "_speed "> 每秒允许下载的字节数 </param>  
     ///  <returns> 返回是否成功 </returns>  
     public static bool ResponseFile(HttpRequest _Request, HttpResponse _Response, string _fileName, string _fullPath, long _speed) 
     { 
         try 
         { 
             FileStream myFile = new FileStream(_fullPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); 
             BinaryReader br = new BinaryReader(myFile); 
             try 
             { 
                 _Response.AddHeader( "Accept-Ranges ",  "bytes "); 
                 _Response.Buffer = false; 
                 long fileLength = myFile.Length; 
                 long startBytes = 0;   
                 int pack = 10240; //10K bytes 
                 //int sleep = 200;   //每秒5次   即5*10K bytes每秒 
                 int sleep = (int)Math.Floor((decimal)1000 * pack / _speed) + 1; 
                 if (_Request.Headers[ "Range "] != null) 
                 { 
                     _Response.StatusCode = 206; 
                     string[] range = _Request.Headers[ "Range "].Split(new char[] {  '= ',  '- ' }); 
                     startBytes = Convert.ToInt64(range[1]); 
                 } 
                 _Response.AddHeader( "Content-Length ", (fileLength - startBytes).ToString()); 
                 if (startBytes != 0) 
                 { 
                     _Response.AddHeader( "Content-Range ", string.Format( " bytes {0}-{1}/{2} ", startBytes, fileLength - 1, fileLength)); 
                 } 
                 _Response.AddHeader( "Connection ",  "Keep-Alive "); 
                 _Response.ContentType =  "application/octet-stream "; 
                 _Response.AddHeader( "Content-Disposition ",  "attachment;filename= " + HttpUtility.UrlEncode(_fileName, System.Text.Encoding.UTF8));   
                 br.BaseStream.Seek(startBytes, SeekOrigin.Begin); 
                 int maxCount = (int)Math.Floor((decimal)(fileLength - startBytes) / pack) + 1;   
                 for (int i = 0; i  < maxCount; i++) 
                 { 
                     if (_Response.IsClientConnected)