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

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

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

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

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

斷點下載:在向服務(wù)器請求下載一個大的資源文件的時候,不是一次Http請求返回所有的資源文件內(nèi)容。而是先通過Head請求,拿到資源文件的大?。▎挝唬鹤止?jié))。然后每次請求只請求一部分字節(jié)的數(shù)據(jù),將請求到的數(shù)據(jù)在本地進(jìn)行拼接。

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

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

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

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

斷點上傳和下載的缺點

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

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

實現(xiàn)基本原理

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

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

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

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

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 () =>
    {
        //獲取到文件總大小 通過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的進(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請求獲取資源文件大小。

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

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

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

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

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

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

以上就是C#使用HttpClient對大文件進(jìn)行斷點上傳和下載的詳細(xì)內(nèi)容,更多關(guān)于C# HttpClient文件上傳和下載的資料請關(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ù)控件名稱獲取控件實例的方法

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

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

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

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

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

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

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

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

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

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

    C# 中的 IReadOnlyDictionary 和 IReadOnlyLis

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

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

    這篇文章主要介紹了C# 正則表達(dá)式進(jìn)階,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(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控件對透明圖片重疊時出現(xiàn)圖片不透明的簡單解決方法

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

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

最新評論

克山县| 抚远县| 建宁县| 米泉市| 长葛市| 凤山县| 清新县| 黔西县| 出国| 卢湾区| 漳平市| 盐城市| 北安市| 石狮市| 黎城县| 乌拉特前旗| 鄂伦春自治旗| 武城县| 颍上县| 阿巴嘎旗| 姜堰市| 淮南市| 阿城市| 北京市| 红原县| 沂南县| 兰溪市| 吉林市| 潼关县| 石阡县| 盘山县| 格尔木市| 蒙山县| 濉溪县| 临夏市| 怀来县| 蓝田县| 仙桃市| 彩票| 垦利县| 宁夏|