以前一直错误的认为在ASP.NET中无法通过编程方式实现多线程断点续传,今天终于获得了这样一个解决方案,让我明白要学习的东西还很多Asp.net(c#)实现多线程断点续传_资料链接

此解决方案基于其它解决方案及相关资料,根据我自己的理解改进.如有错漏,请尽管指出Asp.net(c#)实现多线程断点续传_解决方案_02;如有其它更好的解决方案,请推荐一下Asp.net(c#)实现多线程断点续传_解决方案_02,感谢先。



Asp.net(c#)实现多线程断点续传_ide_04System.IO.Stream iStream = null;

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

Asp.net(c#)实现多线程断点续传_ide_04            // Buffer to read 10K bytes in chunk:

Asp.net(c#)实现多线程断点续传_ide_04            byte[] buffer = new Byte[10240];

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

Asp.net(c#)实现多线程断点续传_ide_04            // Length of the file:

Asp.net(c#)实现多线程断点续传_ide_04            int length;

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

Asp.net(c#)实现多线程断点续传_ide_04            // Total bytes to read:

Asp.net(c#)实现多线程断点续传_ide_04            long dataToRead;

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

Asp.net(c#)实现多线程断点续传_ide_04            // Identify the file to download including its path.

Asp.net(c#)实现多线程断点续传_ide_04            string filepath  = @"E:\software\SQL Server 2000 Personal Edition.ISO";

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

Asp.net(c#)实现多线程断点续传_ide_04            // Identify the file name.

Asp.net(c#)实现多线程断点续传_ide_04            string  filename  = System.IO.Path.GetFileName(filepath);

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

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

Asp.net(c#)实现多线程断点续传_html_22Asp.net(c#)实现多线程断点续传_资料链接_23            Asp.net(c#)实现多线程断点续传_html_24{

Asp.net(c#)实现多线程断点续传_资料链接_25                // Open the file.

Asp.net(c#)实现多线程断点续传_资料链接_25                iStream = new System.IO.FileStream(filepath, System.IO.FileMode.Open, 

Asp.net(c#)实现多线程断点续传_资料链接_25                    System.IO.FileAccess.Read,System.IO.FileShare.Read);

Asp.net(c#)实现多线程断点续传_资料链接_25                Response.Clear();

Asp.net(c#)实现多线程断点续传_资料链接_25

Asp.net(c#)实现多线程断点续传_资料链接_25                // Total bytes to read:

Asp.net(c#)实现多线程断点续传_资料链接_25                dataToRead = iStream.Length;

Asp.net(c#)实现多线程断点续传_资料链接_25

Asp.net(c#)实现多线程断点续传_资料链接_25                long p = 0;

Asp.net(c#)实现多线程断点续传_资料链接_25                if(Request.Headers["Range"]!=null)

Asp.net(c#)实现多线程断点续传_hive_35Asp.net(c#)实现多线程断点续传_ide_36                Asp.net(c#)实现多线程断点续传_html_24{

Asp.net(c#)实现多线程断点续传_资料链接_25                    Response.StatusCode = 206;

Asp.net(c#)实现多线程断点续传_资料链接_25                    p = long.Parse( Request.Headers["Range"].Replace("bytes=","").Replace("-",""));

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

Asp.net(c#)实现多线程断点续传_资料链接_25                if(p != 0)

Asp.net(c#)实现多线程断点续传_hive_35Asp.net(c#)实现多线程断点续传_ide_36                Asp.net(c#)实现多线程断点续传_html_24{

Asp.net(c#)实现多线程断点续传_资料链接_25                    Response.AddHeader("Content-Range","bytes " + p.ToString() + "-" + ((long)(dataToRead - 1)).ToString() + "/" + dataToRead.ToString());                    

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

Asp.net(c#)实现多线程断点续传_资料链接_25                Response.AddHeader("Content-Length",((long)(dataToRead-p)).ToString());

Asp.net(c#)实现多线程断点续传_资料链接_25                Response.ContentType = "application/octet-stream";

Asp.net(c#)实现多线程断点续传_资料链接_25                Response.AddHeader("Content-Disposition", "attachment; filename=" + System.Web.HttpUtility.UrlEncode(Request.ContentEncoding.GetBytes(filename)));

Asp.net(c#)实现多线程断点续传_资料链接_25

Asp.net(c#)实现多线程断点续传_资料链接_25                iStream.Position = p;

Asp.net(c#)实现多线程断点续传_资料链接_25                dataToRead = dataToRead - p;

Asp.net(c#)实现多线程断点续传_资料链接_25                // Read the bytes.

Asp.net(c#)实现多线程断点续传_资料链接_25                while (dataToRead > 0)

Asp.net(c#)实现多线程断点续传_hive_35Asp.net(c#)实现多线程断点续传_ide_36                Asp.net(c#)实现多线程断点续传_html_24{

Asp.net(c#)实现多线程断点续传_资料链接_25                    // Verify that the client is connected.

Asp.net(c#)实现多线程断点续传_资料链接_25                    if (Response.IsClientConnected) 

Asp.net(c#)实现多线程断点续传_hive_35Asp.net(c#)实现多线程断点续传_ide_36                    Asp.net(c#)实现多线程断点续传_html_24{

Asp.net(c#)实现多线程断点续传_资料链接_25                        // Read the data in buffer.

Asp.net(c#)实现多线程断点续传_资料链接_25                        length = iStream.Read(buffer, 0, 10240);

Asp.net(c#)实现多线程断点续传_资料链接_25

Asp.net(c#)实现多线程断点续传_资料链接_25                        // Write the data to the current output stream.

Asp.net(c#)实现多线程断点续传_资料链接_25                        Response.OutputStream.Write(buffer, 0, length);

Asp.net(c#)实现多线程断点续传_资料链接_25

Asp.net(c#)实现多线程断点续传_资料链接_25                        // Flush the data to the HTML output.

Asp.net(c#)实现多线程断点续传_资料链接_25                        Response.Flush();

Asp.net(c#)实现多线程断点续传_资料链接_25

Asp.net(c#)实现多线程断点续传_资料链接_25                        buffer= new Byte[10240];

Asp.net(c#)实现多线程断点续传_资料链接_25                        dataToRead = dataToRead - length;

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

Asp.net(c#)实现多线程断点续传_资料链接_25                    else

Asp.net(c#)实现多线程断点续传_hive_35Asp.net(c#)实现多线程断点续传_ide_36                    Asp.net(c#)实现多线程断点续传_html_24{

Asp.net(c#)实现多线程断点续传_资料链接_25                        //prevent infinite loop if user disconnects

Asp.net(c#)实现多线程断点续传_资料链接_25                        dataToRead = -1;

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

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

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

Asp.net(c#)实现多线程断点续传_ide_04            catch (Exception ex) 

Asp.net(c#)实现多线程断点续传_html_22Asp.net(c#)实现多线程断点续传_资料链接_23            Asp.net(c#)实现多线程断点续传_html_24{

Asp.net(c#)实现多线程断点续传_资料链接_25                // Trap the error, if any.

Asp.net(c#)实现多线程断点续传_资料链接_25                Response.Write("Error : " + ex.Message);

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

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

Asp.net(c#)实现多线程断点续传_html_22Asp.net(c#)实现多线程断点续传_资料链接_23            Asp.net(c#)实现多线程断点续传_html_24{

Asp.net(c#)实现多线程断点续传_资料链接_25                if (iStream != null) 

Asp.net(c#)实现多线程断点续传_hive_35Asp.net(c#)实现多线程断点续传_ide_36                Asp.net(c#)实现多线程断点续传_html_24{

Asp.net(c#)实现多线程断点续传_资料链接_25                    //Close the file.

Asp.net(c#)实现多线程断点续传_资料链接_25                    iStream.Close();

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

                   Response.End();

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