jianglanshui

 

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


http://blog.csdn.net/laolaowhn/article/details/1821886

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

        分类:            0.asp.net文件上传下载540人阅读评论(0)收藏举报
Asp.net(c#)实现多线程断点续传 

  CSDN Blog推出文章指数概念,文章指数是对Blog文章综合评分后推算出的,综合评分项分别是该文章的点击量,回复次数,被网摘收录数量,文章长度和文章类型;满分100,每月更新一次。

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

以前一直错误的认为在ASP.NET中无法通过编程方式实现多线程断点续传,今天终于获得了这样一个解决方案,让我明白要学习的东西还很多
此解决方案基于其它解决方案及相关资料,根据我自己的理解改进.如有错漏,请尽管指出;如有其它更好的解决方案,请推荐一下,感谢先。

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();
            }

posted on 2013-01-25 14:19 老蒋 阅读(183) 评论(0)  编辑  收藏


只有注册用户登录后才能发表评论。


网站导航:
 

导航

统计

常用链接

留言簿

随笔档案

搜索

最新评论

阅读排行榜

评论排行榜