无码国模产在线观看免费-无码国内精品久久人妻-无码国内精品久久综合88-无码国内精品人妻少妇-无码国内精品人妻少妇蜜桃视频-无码国语中文在线播放

LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

C#如何使用HttpClient對(duì)大文件進(jìn)行斷點(diǎn)上傳和下載

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

什么是Http的斷點(diǎn)上傳和下載

斷點(diǎn)上傳:在向服務(wù)商上傳大文件的時(shí)候,將一個(gè)大的文件拆分成多個(gè)小的文件,每個(gè)文件通過(guò)單獨(dú)的Http請(qǐng)求上傳給服務(wù)器。

斷點(diǎn)下載:在向服務(wù)器請(qǐng)求下載一個(gè)大的資源文件的時(shí)候,不是一次Http請(qǐng)求返回所有的資源文件內(nèi)容。而是先通過(guò)Head請(qǐng)求,拿到資源文件的大小(單位:字節(jié))。然后每次請(qǐng)求只請(qǐng)求一部分字節(jié)的數(shù)據(jù),將請(qǐng)求到的數(shù)據(jù)在本地進(jìn)行拼接。

斷點(diǎn)上傳和下載的優(yōu)點(diǎn)

1、避免網(wǎng)絡(luò)中斷時(shí),重傳所有資源文件內(nèi)容。

2、提高服務(wù)器并發(fā),防止單個(gè)客戶端長(zhǎng)時(shí)間和服務(wù)器保持連接。

3、可以實(shí)時(shí)顯示上傳和下載的進(jìn)度。

斷點(diǎn)上傳和下載的缺點(diǎn)

1、占用更多的網(wǎng)絡(luò)帶寬,因?yàn)槊看蜨ttp請(qǐng)求都會(huì)附帶各種額外的信息。

2、上傳和下載的時(shí)間會(huì)變得長(zhǎng)一點(diǎn),因?yàn)槭峭ㄟ^(guò)多次請(qǐng)求來(lái)完成斷點(diǎn)上傳和下載。

實(shí)現(xiàn)基本原理

依賴Http協(xié)議的幾個(gè)基本的協(xié)議頭來(lái)完成斷點(diǎn)上傳和下載。

1、Content-Range:這是一個(gè)響應(yīng)頭,表示請(qǐng)求的資源文件大小,我們可以通過(guò)Head請(qǐng)求拿到的資源文件的字節(jié)數(shù),就是讀取的這個(gè)字段。

2、Range :這是一個(gè)請(qǐng)求頭,表示客戶端要請(qǐng)求的數(shù)組的范圍。如如:"0-1000"、"1001-2000"、"2001-3000"等,服務(wù)器接收到這個(gè)請(qǐng)求頭之后,只給我們返回對(duì)應(yīng)范圍內(nèi)的資源字節(jié)數(shù)組,不會(huì)把所有的字節(jié)數(shù)都返回給我們。

一般請(qǐng)求下,這兩個(gè)請(qǐng)求頭就可以實(shí)現(xiàn)簡(jiǎn)單的斷點(diǎn)上傳和下載。本篇文章我們使用一個(gè)WPF項(xiàng)目演示斷點(diǎn)下載。

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

private void Button_Click(object sender, RoutedEventArgs e)
{
   Task.Run(async () =>
   {
       //獲取到文件總大小 通過(guò)head請(qǐng)求
       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的進(jìn)度
           downLoadingSize += bytes.Length;
           int process = (int)((downLoadingSize / (decimal)totalSize) * 100);
           this.Dispatcher.Invoke(() =>
           {
               cont.Text = process + "%";
               this.processBar.Value = process;
           });
       }
       fileStream.Close();
   });
}6

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

我們主要通過(guò)以下代碼實(shí)現(xiàn),通過(guò)設(shè)置HttpMethod.Head構(gòu)建一個(gè)HttpRequestMessage的請(qǐng)求對(duì)象

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

其次是斷點(diǎn)下載過(guò)程中,Range請(qǐng)求頭如何設(shè)置:

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

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

當(dāng)然在這個(gè)過(guò)程中,我們還要考慮一個(gè)問(wèn)題,如果服務(wù)器的資源文件發(fā)生了修改會(huì)怎么樣。如果我們繼續(xù)下載的話 ,就會(huì)出現(xiàn)問(wèn)題。因?yàn)榭蛻舳讼螺d的文件都不是同一個(gè)文件。這種情況下,我們可以使用Http的請(qǐng)求頭Last-Modified來(lái)判斷文件是否修改,這個(gè)請(qǐng)求頭表示文件的最近一次修改時(shí)間。當(dāng)我們第一次請(qǐng)求數(shù)據(jù)的時(shí)候可以把這個(gè)請(qǐng)求頭的時(shí)間記錄下來(lái),后續(xù)請(qǐng)求如果服務(wù)器資源文件發(fā)生變化,我們就將本地文件全部刪除,然后重新發(fā)起請(qǐng)求。


閱讀原文:原文鏈接


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

主站蜘蛛池模板: 国产av永久福利资源网站 | 亚洲人成网站999久久久综合 | 久久久久免费国产 | 成人国产在线欧美精品 | 亚洲精品无码aⅴ中文字幕 亚洲精品无码aⅴ中文字幕蜜桃 | 51精品国产综合久久久久久 | 无码中文字幕免费一区二区蜜桃 | 国产美女a免费视频 | 日本无翼乌邪恶大全彩男男 | 性色a∨人人爽网站hd | 人妻在线无码一区二区三区 | 日韩成人片无码区 | 另类亚洲欧美日韩欧美 | 女人体免费一区二区 | 欧美三级一区二区三区 | 福利视频导航 | 久久久国产精品免费视频 | 亚洲精品无码专区久久同性男 | 亚洲综合色无码一 | 国产成人久久精品av | 亚洲一级在线观看 | 中文国产剧情演绎丝 | 亚洲成人小说网站色在线观看 | 国产精品一区二区三区 | 欧美日韩精品视频二区 | 欧美激情一区二区久久久 | 国产日韩视频在线观看 | 国产做a爱片久久毛 | 国产欧美日韩视频一区二区三区 | 日日摸夜夜添夜夜添A片图片 | 日本人妻波多野吉衣无码视频 | 美女黄频网站一区二区三区 | 黄色网在线免费观看 | a片地址 | 99久久免费只有精品国产免费视频 | 久久精品国产日本一区二区 | 国产精品户外野外 | 91尤物国产尤物福利在线 | 亚洲国产精品无码久久久古装剧 | 99福利网| 亚洲av永久无码嘿嘿嘿嘿 |