Asp.net檔案下載

來源:互聯網
上載者:User

多線程斷點續傳

 

 1         public bool ResponseDownload(string path) {
 2             long fileLength;
 3             long startRange = 0;
 4             int pack = 10240;//10k
 5             string filename=Path.GetFileName(path);
 6             try {
 7                 FileStream dStream = new FileStream(path, FileMode.Open, FileAccess.Read);
 8                 byte[] buffer = new byte[pack];
 9                 //BinaryReader br = new BinaryReader(dStream);
10                 try {
11                     Page.Response.Clear();
12                     Response.Buffer = false;
13                     Response.AddHeader("Accept-Ranges", "bytes");
14                     
15                     fileLength = dStream.Length;
16                     long sp = 0;
17                     long ep = 0;
18                     if (Request.Headers["Range"] != null) {
19                         Response.StatusCode = 206;
20                         string[] range = Request.Headers["Range"].Split(new char[] { '=', '-' });
21                         if (range.Length == 3&&!string.IsNullOrEmpty(range[2])) {
22                             ep = Convert.ToInt64(range[2]);
23                         }
24                         sp = Convert.ToInt64(range[1]);
25                         if (ep < sp) {
26                             ep = 0;
27                         }
28                     }
29                     long contLength = ep == 0 ? fileLength - sp : ep - sp + 1;
30                     
31                     if (sp != 0) {
32                         Response.AddHeader("Content-Range", String.Format("bytes {0}-{1}/{2}", sp, ep == 0 ? fileLength - 1 : ep, fileLength));
33                     }
34 
35                     Response.AddHeader("Content-Length", contLength.ToString());
36                     Response.AddHeader("Content-Disposition", "attachment;filename=" + System.Web.HttpUtility.UrlEncode(filename, System.Text.Encoding.UTF8));
37                     Response.AddHeader("Connection", "Keep-Alive");
38                     Response.ContentType = "application/octest-stream";
39                     Response.Flush();
40                     
41                     //calculate file size;
42                     long maxCount = ep==0?fileLength:ep+1;
43 
44                     maxCount = maxCount - sp;
45 
46                     //move file handler to range point.
47                     dStream.Seek(sp, SeekOrigin.Begin);
48 
49                     while (maxCount > 0&&Response.IsClientConnected) {
50                         int lengthRead = dStream.Read(buffer, 0, Convert.ToInt32(pack));
51                         Response.OutputStream.Write(buffer, 0, lengthRead);
52                         Response.Flush();    
53                         maxCount -= pack;
54                     }
55                     
56                 }
57                 catch (Exception e) {
58                     Response.Write("<h3>Error:</h3>" + e.Message);
59                     return false;
60                 }
61                 finally {
62                     dStream.Close();
63                 }
64 
65             }
66             catch (Exception ex) {
67                 Response.Write("<h3>Error:</h3>" + ex.Message);
68                 return false;
69             }
70             return true;
71         }

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.