c#实现断点续传功能示例分享


在C#中实现断点续传功能,我们通常会使用HTTP协议中的`Range`头部来请求文件的特定部分,并在本地管理已下载的数据块。这里我将提供一个简化的示例,展示如何发起带有`Range`头部的HTTP请求,并在本地文件系统中处理这些下载的数据块。

注意,这个示例主要关注于断点续传的逻辑,并不包括完整的错误处理和优化策略。


using System;
using System.IO;
using System.Net.Http;
using System.Threading.Tasks;

class Program
{
    static async Task DownloadFileWithResumeAsync(string url, string filePath, int? startByte = null)
    {
        using (HttpClient client = new HttpClient())
        {
            HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, url);

            // 如果startByte有值,设置Range头部
            if (startByte.HasValue)
            {
                request.Headers.Range = new System.Net.Http.Headers.RangeHeaderValue(startByte.Value);
            }

            HttpResponseMessage response = await client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead);

            // 检查服务器是否支持范围请求
            if (!response.IsSuccessStatusCode || !response.Content.Headers.ContentLength.HasValue)
            {
                Console.WriteLine("Error downloading file.");
                return;
            }

            // 创建或打开文件
            using (FileStream fileStream = new FileStream(filePath, FileMode.Append, FileAccess.Write, FileShare.None))
            {
                // 读取响应体并写入文件
                await response.Content.CopyToAsync(fileStream);
            }

            Console.WriteLine($"Downloaded {response.Content.Headers.ContentLength.Value} bytes.");
        }
    }

    static async Task Main(string[] args)
    {
        string fileUrl = "http://example.com/largefile.zip";
        string localFilePath = "largefile.zip";

        // 假设我们要从1000字节处开始下载
        int? startByte = 1000;

        await DownloadFileWithResumeAsync(fileUrl, localFilePath, startByte);
    }
}

**重要提示**:

1. **错误处理**:上面的代码示例中省略了详细的错误处理逻辑,例如网络错误、文件访问权限问题等。在生产环境中,你需要添加适当的错误处理来确保程序的健壮性。

2. **Range头部**:服务器必须支持`Range`头部才能实现断点续传。如果服务器不支持,或者请求的起始字节无效,服务器可能会返回`416 Range Not Satisfiable`错误。

3. **文件追加**:在这个示例中,我们使用`FileMode.Append`来打开文件,这意味着新下载的数据会被追加到文件的末尾。这是实现断点续传的关键。

4. **并发和重试**:在实际应用中,你可能需要考虑并发下载多个文件块,并在遇到网络问题时实现重试机制。

5. **安全性**:在处理来自外部源(如HTTP服务器)的数据时,请确保采取适当的安全措施,以防止潜在的安全风险,如恶意文件下载等。