最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2024年06月25日 09:25:38   作者:貓霸12354  
這篇文章主要介紹了C#如何使用HttpClient對(duì)大文件進(jìn)行斷點(diǎn)上傳和下載,文章通過(guò)代碼示例講解的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下

什么是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);

        //開(kāi)始分片下載
        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();
    });
}

在以上代碼中,首先是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ò)斷開(kāi),下次請(qǐng)求的時(shí)候,讀取本地文件大小,假設(shè)本地未見(jiàn)大小為1000,那么我們請(qǐng)求的時(shí)候Range就從1001開(kāi)始,這樣服務(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)求。

以上就是C#使用HttpClient對(duì)大文件進(jìn)行斷點(diǎn)上傳和下載的詳細(xì)內(nèi)容,更多關(guān)于C# HttpClient文件上傳和下載的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C# 分支與循環(huán)介紹

    C# 分支與循環(huán)介紹

    在C# 程序中有三種結(jié)構(gòu): 順序結(jié)構(gòu),分支結(jié)構(gòu),循環(huán)結(jié)構(gòu)。
    2013-04-04
  • 在C#中根據(jù)控件名稱獲取控件實(shí)例的方法

    在C#中根據(jù)控件名稱獲取控件實(shí)例的方法

    這篇文章主要介紹了在C#中根據(jù)控件名稱遍歷并獲取窗口或容器中控件實(shí)例的兩種方法,分別是WinForms中的Control.Find方法和遞歸遍歷,以及WPF中的LogicalTreeHelper.FindLogicalNode和遞歸遍歷邏輯樹(shù),需要的朋友可以參考下
    2026-01-01
  • c# for循環(huán)中創(chuàng)建線程執(zhí)行問(wèn)題

    c# for循環(huán)中創(chuàng)建線程執(zhí)行問(wèn)題

    這篇文章主要介紹了有關(guān)c# for循環(huán)中創(chuàng)建線程執(zhí)行問(wèn)題,下面文章將將以舉例的方式展開(kāi)for循環(huán)中創(chuàng)建線程執(zhí)行問(wèn)題的內(nèi)容,需要的朋友可以參考一下,希望對(duì)你有所幫助
    2021-11-11
  • C#中查找Dictionary中重復(fù)值的方法

    C#中查找Dictionary中重復(fù)值的方法

    這篇文章主要介紹了C#中查找Dictionary中重復(fù)值的方法,有需要的朋友可以參考一下
    2014-01-01
  • 基于C#實(shí)現(xiàn)員工IC卡的讀寫功能

    基于C#實(shí)現(xiàn)員工IC卡的讀寫功能

    這篇文章主要為大家詳細(xì)介紹了C#如何實(shí)現(xiàn)讀寫員工IC卡的功能,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C#有一定的幫助,感興趣的小伙伴可以跟隨小編一起了解一下
    2023-01-01
  • 手把手教你如何基于C#制作一個(gè)網(wǎng)址檢測(cè)工具

    手把手教你如何基于C#制作一個(gè)網(wǎng)址檢測(cè)工具

    這篇文章主要給大家介紹了關(guān)于如何基于C#制作一個(gè)網(wǎng)址檢測(cè)工具的相關(guān)資料,文中通過(guò)圖文以及實(shí)例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用C#具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2023-02-02
  • C# 中的 IReadOnlyDictionary 和 IReadOnlyList實(shí)例詳解

    C# 中的 IReadOnlyDictionary 和 IReadOnlyLis

    C# 中的IReadOnlyDictionary和IReadOnlyList是接口,用于表示只讀的字典和只讀的列表,這些接口提供了對(duì)集合的只讀訪問(wèn)權(quán)限,即不允許對(duì)集合進(jìn)行修改操作,這篇文章主要介紹了C# 中的 IReadOnlyDictionary 和 IReadOnlyList實(shí)例詳解,需要的朋友可以參考下
    2024-03-03
  • C# 正則表達(dá)式進(jìn)階

    C# 正則表達(dá)式進(jìn)階

    這篇文章主要介紹了C# 正則表達(dá)式進(jìn)階,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • WinForm中DefWndProc、WndProc與IMessageFilter的區(qū)別

    WinForm中DefWndProc、WndProc與IMessageFilter的區(qū)別

    這篇文章主要介紹了WinForm中DefWndProc、WndProc與IMessageFilter的區(qū)別,較為詳細(xì)的分析了WinForm的消息處理機(jī)制,需要的朋友可以參考下
    2014-08-08
  • C# WinForm控件對(duì)透明圖片重疊時(shí)出現(xiàn)圖片不透明的簡(jiǎn)單解決方法

    C# WinForm控件對(duì)透明圖片重疊時(shí)出現(xiàn)圖片不透明的簡(jiǎn)單解決方法

    這篇文章主要介紹了C# WinForm控件對(duì)透明圖片重疊時(shí)出現(xiàn)圖片不透明的簡(jiǎn)單解決方法,結(jié)合實(shí)例形式分析了WinForm圖片重疊后造成圖片不透明的原因與相應(yīng)的解決方法,需要的朋友可以參考下
    2016-06-06

最新評(píng)論

三都| 焦作市| 浙江省| 渭南市| 大城县| 洛宁县| 黎川县| 通海县| 丹寨县| 韶山市| 万载县| 汾西县| 当雄县| 孟州市| 鹰潭市| 东阿县| 隆化县| 乌拉特后旗| 东莞市| 无锡市| 仪陇县| 乳源| 德阳市| 云霄县| 古浪县| 建湖县| 佛学| 大港区| 高邑县| 永仁县| 曲沃县| 长顺县| 鄄城县| 合肥市| 新乡县| 文安县| 彭山县| 达拉特旗| 紫阳县| 陕西省| 定安县|