断点续传

//这是断点续传的下载进度我想应该可以得到已经下载的文件大小!  
  public   static   bool   ResponseFile(   System.Web.HttpRequest   _Request,  
                        System.Web.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  
            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="   +   System.Web.HttpUtility.UrlEncode(_fileName,System.Text.Encoding.UTF8)   );  
             
            br.BaseStream.Seek(startBytes,   SeekOrigin.Begin);  
            
int   maxCount   =   (int)   Math.Floor((fileLength   -   startBytes)   /   pack)   +   1;  
            
byte[]   buffer=new   byte[pack];  

            
for   (int   i   =   0;   i   <   maxCount;   i++)  
            
{  
              
if   (_Response.IsClientConnected)  
              
{  
                buffer
=br.ReadBytes(pack);  
                _Response.OutputStream.Write(buffer,   
0,   pack);  
                _Response.Flush();  
                buffer
=new   byte[pack];  

              }
  
              
else  
              
{  
                i
=maxCount;    
              }
  
            }
  
          }
  
          
catch(Exception   myerror)    
          
{  
            
throw   myerror;  
          }
  
          
finally  
          
{  
            br.Close();  
            myFile.Close();  
          }
  
        }
  
        
catch(Exception   myerror)  
        
{  
          
throw   myerror;    
        }
  
        
return   true;  
      }
   
posted @ 2007-12-10 14:29  Lorn  阅读(372)  评论(0编辑  收藏  举报