.net实现下载功能

ASP.NET中文件的下载(摘自http://www.aspxboy.com/private/showthread.asp?threadid=233
一.  服务端通过Response输出相应的HTTP  Response  Headers信息,和要下载的文件的数据来把文件发送到客户端,HTTP  Response  Headers表现在html文件中是下面的形式:
<meta  http-equiv="Content-Type"  content="text/htm  ">
http-equiv表示是Headers的名称,content表示这个Headers的值

二.  首先,要输出文件的MIME类型:
Page.Response.AddHeader(  "Content-Type",  “MIME类型”  );

三.  其次,要输出下载的文件的打开位置和文件名:
Page.Response.AddHeader("Content-Disposition",  "attachment;filename="  +  FileName  );
content -disposition  的  HTTP  response  header  允许指定文档表示的信息。使用这种  header  ,你就可以将文档指定成单独打开(而不是在浏览器中打开),还可以根据用户的操作来显示。如果用户要保存文档,你还可以为该文档建议一个文件名。这个建议名称会出现在  Save  As  对话框的“文件名”栏中。
attachment  ――  表示作为附件发送到客户端,客户端将单独打开此文件。
inline  ――  表示将在浏览器中打开这个文件。
filename  ――  表示发送到客户端文件的文件名。

四.  准备发送到客户端的文件数据:
不管什么类型的文件都要先转成byte类型的数组,然后将这个byte数组用Response.BinaryWrite方法输出到客户端。

      

None.gif string   path   = " G:\\download\\down.txt " ;
None.gif      System.IO.FileInfo  file  
=    new   System.IO.FileInfo(path);  
None.gif      Response.Clear();  
None.gif      Response.AddHeader(
" Content-Disposition " ,   " attachment;  filename= "    +   HttpUtility.UrlEncode(file.Name));  
None.gif
None.gif      Response.AddHeader(
" Content-Length " ,  file.Length.ToString());  
None.gif      Response.ContentType  
=    " application/octet-stream " ;  
None.gif      Response.WriteFile(file.FullName);  
None.gif      Response.End(); 
None.gif
None.gif

对于中文名解决方法:
string    filename    =  System.Web.HttpUtility.UrlEncode(  System.Text.Encoding.UTF8.GetBytes(filepath));
其他方式:
1,

None.gif private       void      FileDownload( string      fName,      string      path)  
ExpandedBlockStart.gifContractedBlock.gif  
dot.gif {  
InBlock.gif                  
long     lngFileSize;      
InBlock.gif                  
byte[]     bytBuffer;      
InBlock.gif                  
int     iReading;      
InBlock.gif                  
string     sFileName     =     Server.MapPath(path     +     fName);      
InBlock.gif                  Stream     outStream     
=     Response.OutputStream;      
InBlock.gif                  Response.ContentType
="application/octet-stream";      
InBlock.gif                  Response.AppendHeader(
"Connection","keep-alive");      
InBlock.gif                  Response.AppendHeader(
"Content-Disposition","     attachment;     filename     =     "+fName     );      
InBlock.gif                  FileStream     fStream     
=     new     FileStream(sFileName,FileMode.OpenOrCreate,FileAccess.Read);      
InBlock.gif                  lngFileSize     
=     fStream.Length;      
InBlock.gif                  bytBuffer     
=     new     byte[(int)lngFileSize];      
InBlock.gif              
while((iReading=fStream.Read(bytBuffer,0,(int)lngFileSize))     >     0)      
ExpandedSubBlockStart.gifContractedSubBlock.gif              
dot.gif{      
InBlock.gif                  outStream.Write(bytBuffer,
0,iReading);      
ExpandedSubBlockEnd.gif              }
      
InBlock.gif              fStream.Close();      
InBlock.gif              outStream.Close();      
ExpandedBlockEnd.gif  }

2,

ExpandedBlockStart.gif ContractedBlock.gif /**/ ///   <summary>  
InBlock.gif  
///   文件下载  
InBlock.gif  
///   </summary>  
ExpandedBlockEnd.gif  
///   <param   name="FullFileName">包括路径在内的文件名</param>  

None.gif    public     static     void    FileDownloadByFullName( string    FullFileName)  
ExpandedBlockStart.gifContractedBlock.gif  
dot.gif {  
InBlock.gif  FileInfo   DownloadFile   
=   new   FileInfo(FullFileName);    
InBlock.gif  HttpContext.Current.Response.Clear();  
InBlock.gif  HttpContext.Current.Response.ClearHeaders();  
InBlock.gif  HttpContext.Current.Response.Buffer
=false;  
InBlock.gif  HttpContext.Current.Response.ContentType
="application/octet-stream";  
InBlock.gif  HttpContext.Current.Response.AppendHeader(
"Content-Disposition","attachment;filename="   +HttpUtility.UrlEncode(DownloadFile.FullName,System.Text.Encoding.ASCII));  
InBlock.gif  HttpContext.Current.Response.AppendHeader(
"Content-Length",DownloadFile.Length.ToString());  
InBlock.gif  HttpContext.Current.Response.WriteFile(DownloadFile.FullName);  
InBlock.gif  HttpContext.Current.Response.Flush();  
InBlock.gif  HttpContext.Current.Response.End();  
ExpandedBlockEnd.gif  }

3, 
ASP.NET提供文件下载函数(支持大文件、续传、速度限制、资源占用小)    
   
  原稿CSDN网友   maling(***)   (   )    
None.gif    
None.gif  
//    输出硬盘文件,提供下载  
None.gif  
//    输入参数   _Request:   Page.Request对象,   _Response:   Page.Response对象,   _fileName:   下载文件名,   _fullPath:   带文件名下载路径,   _speed   每秒允许下载的字节数  
None.gif  
//    返回是否成功  
None.gif
   public     static     bool    ResponseFile(HttpRequest   _Request,HttpResponse   _Response, string    _fileName, string    _fullPath,    long    _speed)  
ExpandedBlockStart.gifContractedBlock.gif  
dot.gif {  
InBlock.gif  
try  
ExpandedSubBlockStart.gifContractedSubBlock.gif  
dot.gif{  
InBlock.gif  FileStream   myFile   
=   new   FileStream(_fullPath,   FileMode.Open,   FileAccess.Read,   FileShare.ReadWrite);  
InBlock.gif  BinaryReader   br   
=   new   BinaryReader(myFile);  
InBlock.gif  
try  
ExpandedSubBlockStart.gifContractedSubBlock.gif  
dot.gif{  
InBlock.gif  _Response.AddHeader(
"Accept-Ranges",   "bytes");  
InBlock.gif  _Response.Buffer   
=   false;  
InBlock.gif  
long   fileLength   =   myFile.Length;  
InBlock.gif  
long   startBytes   =   0;  
InBlock.gif   
InBlock.gif  
int   pack   =   10240;   //10K   bytes  
InBlock.gif  
//int   sleep   =   200;   //每秒5次   即5*10K   bytes每秒  
InBlock.gif
  int   sleep   =   (int)Math.Floor(1000   *   pack   /   _speed)   +   1;  
InBlock.gif  
if   (_Request.Headers["Range"]   !=   null)  
ExpandedSubBlockStart.gifContractedSubBlock.gif  
dot.gif{  
InBlock.gif  _Response.StatusCode   
=   206;  
ExpandedSubBlockStart.gifContractedSubBlock.gif  
string[]   range   =   _Request.Headers["Range"].Split(new   char[]   dot.gif{'=',   '-'});  
InBlock.gif  startBytes   
=   Convert.ToInt64(range[1]);  
ExpandedSubBlockEnd.gif  }
  
InBlock.gif  _Response.AddHeader(
"Content-Length",   (fileLength   -   startBytes).ToString());  
InBlock.gif  
if   (startBytes   !=   0)  
ExpandedSubBlockStart.gifContractedSubBlock.gif  
dot.gif{  
InBlock.gif  _Response.AddHeader(
"Content-Range",   string.Format("   bytes   {0}-{1}/{2}",   startBytes,   fileLength-1,   fileLength));  
ExpandedSubBlockEnd.gif  }
  
InBlock.gif  _Response.AddHeader(
"Connection",   "Keep-Alive");  
InBlock.gif  _Response.ContentType   
=   "application/octet-stream";  
InBlock.gif  _Response.AddHeader(
"Content-Disposition","attachment;filename="   +   HttpUtility.UrlEncode(_fileName,System.Text.Encoding.UTF8)   );  
InBlock.gif   
InBlock.gif  br.BaseStream.Seek(startBytes,   SeekOrigin.Begin);  
InBlock.gif  
int   maxCount   =   (int)   Math.Floor((fileLength   -   startBytes)   /   pack)   +   1;  
InBlock.gif   
InBlock.gif  
for   (int   i   =   0;   i   <   maxCount;   i++)  
ExpandedSubBlockStart.gifContractedSubBlock.gif  
dot.gif{  
InBlock.gif  
if   (_Response.IsClientConnected)  
ExpandedSubBlockStart.gifContractedSubBlock.gif  
dot.gif{  
InBlock.gif  _Response.BinaryWrite(br.ReadBytes(pack));  
InBlock.gif  Thread.Sleep(sleep);  
ExpandedSubBlockEnd.gif  }
  
InBlock.gif  
else  
ExpandedSubBlockStart.gifContractedSubBlock.gif  
dot.gif{  
InBlock.gif  i
=maxCount;    
ExpandedSubBlockEnd.gif  }
  
ExpandedSubBlockEnd.gif  }
  
ExpandedSubBlockEnd.gif  }
  
InBlock.gif  
catch  
ExpandedSubBlockStart.gifContractedSubBlock.gif  
dot.gif{  
InBlock.gif  
return   false;  
ExpandedSubBlockEnd.gif  }
  
InBlock.gif  
finally  
ExpandedSubBlockStart.gifContractedSubBlock.gif  
dot.gif{  
InBlock.gif  br.Close();  
InBlock.gif  myFile.Close();  
ExpandedSubBlockEnd.gif  }
  
ExpandedSubBlockEnd.gif  }
  
InBlock.gif  
catch  
ExpandedSubBlockStart.gifContractedSubBlock.gif  
dot.gif{  
InBlock.gif  
return   false;  
ExpandedSubBlockEnd.gif  }
  
InBlock.gif  
return   true;  
ExpandedBlockEnd.gif  }
   

   调用例
None.gif Page.Response.Clear();  
None.gif   
None.gif  
bool    success    =    ResponseFile(Page.Request,   Page.Response,    " filename " ,    @" C:\download.date " ,    1024000 );  
None.gif   
None.gif  
if ( ! success)  
None.gif  Response.Write(
" 下载文件出错! " );  
None.gif   
None.gif  Page.Response.End();  

转载于:https://www.cnblogs.com/wyh4988/archive/2006/12/25/602882.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值