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

Posted on 2007-05-24 21:56  Leon0812  阅读(199)  评论(0编辑  收藏  举报
 1System.IO.Stream iStream = null;
 2
 3            // Buffer to read 10K bytes in chunk:
 4            byte[] buffer = new Byte[10240];
 5
 6            // Length of the file:
 7            int length;
 8
 9            // Total bytes to read:
10            long dataToRead;
11
12            // Identify the file to download including its path.
13            string filepath  = @"E:\software\SQL Server 2000 Personal Edition.ISO";
14
15            // Identify the file name.
16            string  filename  = System.IO.Path.GetFileName(filepath);
17
18            try
19            {
20                // Open the file.
21                iStream = new System.IO.FileStream(filepath, System.IO.FileMode.Open, 
22                    System.IO.FileAccess.Read,System.IO.FileShare.Read);
23                Response.Clear();
24
25                // Total bytes to read:
26                dataToRead = iStream.Length;
27
28                long p = 0;
29                if(Request.Headers["Range"]!=null)
30                {
31                    Response.StatusCode = 206;
32                    p = long.Parse( Request.Headers["Range"].Replace("bytes=","").Replace("-",""));
33                }

34                if(p != 0)
35                {
36                    Response.AddHeader("Content-Range","bytes " + p.ToString() + "-" + ((long)(dataToRead - 1)).ToString() + "/" + dataToRead.ToString());                    
37                }

38                Response.AddHeader("Content-Length",((long)(dataToRead-p)).ToString());
39                Response.ContentType = "application/octet-stream";
40                Response.AddHeader("Content-Disposition""attachment; filename=" + System.Web.HttpUtility.UrlEncode(Request.ContentEncoding.GetBytes(filename)));
41
42                iStream.Position = p;
43                dataToRead = dataToRead - p;
44                // Read the bytes.
45                while (dataToRead > 0)
46                {
47                    // Verify that the client is connected.
48                    if (Response.IsClientConnected) 
49                    {
50                        // Read the data in buffer.
51                        length = iStream.Read(buffer, 010240);
52
53                        // Write the data to the current output stream.
54                        Response.OutputStream.Write(buffer, 0, length);
55
56                        // Flush the data to the HTML output.
57                        Response.Flush();
58
59                        buffer= new Byte[10240];
60                        dataToRead = dataToRead - length;
61                    }

62                    else
63                    {
64                        //prevent infinite loop if user disconnects
65                        dataToRead = -1;
66                    }

67                }

68            }

69            catch (Exception ex) 
70            {
71                // Trap the error, if any.
72                Response.Write("Error : " + ex.Message);
73            }

74            finally
75            {
76                if (iStream != null
77                {
78                    //Close the file.
79                    iStream.Close();
80                }

81                   Response.End();
82            }

Copyright © 2024 Leon0812
Powered by .NET 9.0 on Kubernetes