日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

C#如何使用HttpClient对大文件进行断点上传和下载

發布時間:2025/3/8 C# 45 如意码农
生活随笔 收集整理的這篇文章主要介紹了 C#如何使用HttpClient对大文件进行断点上传和下载 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

什么是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 = "https://img02.100why.cn/HCT20250308/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();
});
}

在以上代碼中,首先是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來判斷文件是否修改,這個請求頭表示文件的最近一次修改時間。當我們第一次請求數據的時候可以把這個請求頭的時間記錄下來,后續請求如果服務器資源文件發生變化,我們就將本地文件全部刪除,然后重新發起請求。

聯系站長

站長公眾號

推薦閱讀

  • C#棄元表達式的用法
  • 記錄一次JSON.NET反序列化帶來的內存爆炸問題
  • C#如何使用HttpClient對大文件進行斷點上傳和下載
  • Windows Api如何創建一個快捷方式并且在開始菜單搜索到自己的應用
  • .NET Core配置文件發生變更的時候,程序如何接受
  • C#如何將文件壓縮成ZIP并且實時顯示壓縮進度
  • 線性表
  • 順序棧
  • 鏈棧
  • 數組實現隊列

總結

以上是生活随笔為你收集整理的C#如何使用HttpClient对大文件进行断点上传和下载的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。