精品熟人妻一区二区三区四区不卡-精品爽黄69天堂a-精品水蜜桃久久久久久久-精品丝袜国产自在线拍-精品丝袜国产自在线拍a-精品丝袜国产自在线拍免费看

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

C#如何使用HttpClient對大文件進行斷點上傳和下載

admin
2025年3月30日 19:22 本文熱度 322

什么是Http的斷點上傳和下載

斷點上傳:在向服務商上傳大文件的時候,將一個大的文件拆分成多個小的文件,每個文件通過單獨的Http請求上傳給服務器。

斷點下載:在向服務器請求下載一個大的資源文件的時候,不是一次Http請求返回所有的資源文件內容。而是先通過Head請求,拿到資源文件的大小(單位:字節)。然后每次請求只請求一部分字節的數據,將請求到的數據在本地進行拼接。

斷點上傳和下載的優點

1、避免網絡中斷時,重傳所有資源文件內容。

2、提高服務器并發,防止單個客戶端長時間和服務器保持連接。

3、可以實時顯示上傳和下載的進度。

斷點上傳和下載的缺點

1、占用更多的網絡帶寬,因為每次Http請求都會附帶各種額外的信息。

2、上傳和下載的時間會變得長一點,因為是通過多次請求來完成斷點上傳和下載。

實現基本原理

依賴Http協議的幾個基本的協議頭來完成斷點上傳和下載。

1、Content-Range:這是一個響應頭,表示請求的資源文件大小,我們可以通過Head請求拿到的資源文件的字節數,就是讀取的這個字段。

2、Range :這是一個請求頭,表示客戶端要請求的數組的范圍。如如:"0-1000"、"1001-2000"、"2001-3000"等,服務器接收到這個請求頭之后,只給我們返回對應范圍內的資源字節數組,不會把所有的字節數都返回給我們。

一般請求下,這兩個請求頭就可以實現簡單的斷點上傳和下載。本篇文章我們使用一個WPF項目演示斷點下載。

string url = "http://file.cshelloworld.com/images/1771477326069108736.jpg";
long totalSize = 0;//文件總大小
long downLoadingSize = 0;//當前已經下載了多少

private void Button_Click(object sender, RoutedEventArgs e)
{
   Task.Run(async () =>
   {
       //獲取到文件總大小 通過head請求
       using HttpClient client = new HttpClient();
       HttpRequestMessage requestMessage = new HttpRequestMessage(HttpMethod.Head, url);
       var response = await client.SendAsync(requestMessage);
       totalSize = response.Content.Headers.ContentLength.Value;
       using FileStream fileStream = new FileStream("d:\\a.jpj", FileMode.Create, FileAccess.Write, FileShare.Read);

       //開始分片下載
       while (downLoadingSize < totalSize)
       {
           //組裝range 0,1000 1000,2000 0,9999
           long start = downLoadingSize;
           long end = start + 1000;
           if (end > (totalSize - 1))
           {
               end = totalSize - 1;
           }
           client.DefaultRequestHeaders.Range = new System.Net.Http.Headers.RangeHeaderValue(start, end);
           var res = await client.GetAsync(url);
           byte[] bytes = await res.Content.ReadAsByteArrayAsync();
           await fileStream.WriteAsync(bytes, 0, bytes.Length);
           //更新UI的進度
           downLoadingSize += bytes.Length;
           int process = (int)((downLoadingSize / (decimal)totalSize) * 100);
           this.Dispatcher.Invoke(() =>
           {
               cont.Text = process + "%";
               this.processBar.Value = process;
           });
       }
       fileStream.Close();
   });
}6

在以上代碼中,首先是Head請求獲取資源文件大小。

我們主要通過以下代碼實現,通過設置HttpMethod.Head構建一個HttpRequestMessage的請求對象

HttpRequestMessage requestMessage = new HttpRequestMessage(HttpMethod.Head, url);

其次是斷點下載過程中,Range請求頭如何設置:

client.DefaultRequestHeaders.Range = new System.Net.Http.Headers.RangeHeaderValue(start, end);

每次請求到字節數組之后,我們將字節數組寫入到本地的文件流中,如果網絡斷開,下次請求的時候,讀取本地文件大小,假設本地未見大小為1000,那么我們請求的時候Range就從1001開始,這樣服務器就給我們返回的是1001之后的字節數組了。

當然在這個過程中,我們還要考慮一個問題,如果服務器的資源文件發生了修改會怎么樣。如果我們繼續下載的話 ,就會出現問題。因為客戶端下載的文件都不是同一個文件。這種情況下,我們可以使用Http的請求頭Last-Modified來判斷文件是否修改,這個請求頭表示文件的最近一次修改時間。當我們第一次請求數據的時候可以把這個請求頭的時間記錄下來,后續請求如果服務器資源文件發生變化,我們就將本地文件全部刪除,然后重新發起請求。


閱讀原文:原文鏈接


該文章在 2025/3/31 11:04:12 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
Copyright 2010-2025 ClickSun All Rights Reserved

主站蜘蛛池模板: 午夜成人影院网站18进 | 性推油按摩av无码专区 | 亚洲成人黄色在线观 | 精品一区精品二区制服 | 毛片无遮挡高清免费 | 亚洲欧美日韩国产高清在线播放 | 无码区国产 | 国产无你高清在线观看av | 国产成人手机高清在线观看网站 | 国产亚洲精久久久久久无码 | 国产麻豆91传媒入口 | 九九亚州精品无码 | 成人国产精品秘果冻传媒在线 | 国产午夜亚洲精品在线观看 | 国产精品无码不卡一区二区三区 | 亚洲资源站中文在线丝袜 | 人妻体内射精一区二区三区 | 日本特色特黄久久久久久 | 精品国产a一级黄色片 | 91po国产在线精品免费 | 欧美真人抽搐一进一出gif | 在线观看欧美一区二区三区 | 狠狠躁夜夜躁无码中文字幕 | 美女高潮无套内谢视频 | 97r热在线观看视频 97se狠狠狠狠狼鲁亚洲综 | 欧美高清一区三区在线专区 | 波多野结衣在线观看一码 | 中文字幕中字幕亚洲 | 国产极品白嫩超清在线观看 | 91精产国品一二三产区公司 | 日韩精品一区二区三区蜜桃 | 91精产国品一二三产区粉粉 | 精品精品国产自在97香蕉 | 91精品国产自产在线观看不卡 | 色欲欧美精品一区成人精品 | 毛片大全在线 | 亚洲成av人片在www色猫咪 | 亚洲av乱码久久精品蜜桃 | 国产在线一区二区三区无码 | 人妻熟妇乱又伦精品视频 | av国内精品久久久久影院 |