jjccx

jjccx's blog
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Asp.net(c#)实现多线程断点续传(转)

Posted on 2005-03-15 10:14  jjccx  阅读(519)  评论(2)    收藏  举报

//From http://www.cnblogs.com/bestcomy/archive/2004/08/10/31950.aspx

System.IO.Stream iStream = null;

 

// Buffer to read 10K bytes in chunk:

byte[] buffer = new Byte[10240];

 

// Length of the file:

int length;

 

// Total bytes to read:

long dataToRead;

 

// Identify the file to download including its path.

string filepath  = @"E:\software\SQL Server 2000 Personal Edition.ISO";

 

// Identify the file name.

string  filename  = System.IO.Path.GetFileName(filepath);

 

try

{

     // Open the file.

     iStream = new System.IO.FileStream(filepath, System.IO.FileMode.Open,

         System.IO.FileAccess.Read,System.IO.FileShare.Read);

     Response.Clear();

 

     // Total bytes to read:

     dataToRead = iStream.Length;

 

     long p = 0;

     if(Request.Headers["Range"]!=null)

     {

         Response.StatusCode = 206;

         p = long.Parse( Request.Headers["Range"].Replace("bytes=","").Replace("-",""));

     }

     if(p != 0)

     {

         Response.AddHeader("Content-Range","bytes " + p.ToString() + "-" + ((long)(dataToRead - 1)).ToString() + "/" + dataToRead.ToString());                   

     }

     Response.AddHeader("Content-Length",((long)(dataToRead-p)).ToString());

     Response.ContentType = "application/octet-stream";

     Response.AddHeader("Content-Disposition", "attachment; filename=" + System.Web.HttpUtility.UrlEncode(Request.ContentEncoding.GetBytes(filename)));

 

     iStream.Position = p;

     dataToRead = dataToRead - p;

     // Read the bytes.

     while (dataToRead > 0)

     {

         // Verify that the client is connected.

         if (Response.IsClientConnected)

         {

              // Read the data in buffer.

              length = iStream.Read(buffer, 0, 10240);

 

              // Write the data to the current output stream.

              Response.OutputStream.Write(buffer, 0, length);

 

              // Flush the data to the HTML output.

              Response.Flush();

 

              buffer= new Byte[10240];

              dataToRead = dataToRead - length;

         }

         else

         {

              //prevent infinite loop if user disconnects

              dataToRead = -1;

         }

     }

}

catch (Exception ex)

{

     // Trap the error, if any.

     Response.Write("Error : " + ex.Message);

}

finally

{

     if (iStream != null)

     {

         //Close the file.

         iStream.Close();

     }

     Response.End();

}