MSDN Community

Download Best Practices

Published: August 12, 2023 • Author: Jane Doe

Overview

Downloading files efficiently and securely is critical for modern applications. This article outlines best practices to ensure reliable, fast, and safe file transfers.

Security Considerations

Performance Tips

Resumable Downloads

Support the HTTP Range header to allow clients to resume interrupted downloads.

Checksum Verification

After download, verify integrity using SHA‑256 or SHA‑512 hashes.

Code Example (C#)

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

public static async Task DownloadFileAsync(string url, string destination)
{
    using var http = new HttpClient();
    http.DefaultRequestHeaders.Add("User-Agent", "MyApp/1.0");
    using var response = await http.GetAsync(url, HttpCompletionOption.ResponseHeadersRead);
    response.EnsureSuccessStatusCode();

    var totalBytes = response.Content.Headers.ContentLength ?? -1L;
    var canReportProgress = totalBytes != -1;

    using var contentStream = await response.Content.ReadAsStreamAsync();
    using var fileStream = new FileStream(destination, FileMode.Create, FileAccess.Write, FileShare.None, 81920, true);
    var buffer = new byte[81920];
    long totalRead = 0;
    int bytesRead;
    while ((bytesRead = await contentStream.ReadAsync(buffer)) != 0)
    {
        await fileStream.WriteAsync(buffer.AsMemory(0, bytesRead));
        totalRead += bytesRead;
        if (canReportProgress)
        {
            Console.WriteLine($"\rDownloaded {totalRead} of {totalBytes} bytes ({(totalRead * 100 / totalBytes)}%)");
        }
    }

    // Verify SHA-256 checksum (example)
    using var sha256 = SHA256.Create();
    fileStream.Position = 0;
    var hash = await sha256.ComputeHashAsync(fileStream);
    Console.WriteLine($"SHA-256: {BitConverter.ToString(hash).Replace("-", "")}");
}