Rumah > pembangunan bahagian belakang > C++ > Bagaimana untuk Melaksanakan Bar Kemajuan dengan HttpClient Semasa Muat Turun Fail?

Bagaimana untuk Melaksanakan Bar Kemajuan dengan HttpClient Semasa Muat Turun Fail?

Mary-Kate Olsen
Lepaskan: 2025-01-12 18:46:41
asal
578 orang telah melayarinya

How to Implement a Progress Bar with HttpClient During File Downloads?

Laksanakan bar kemajuan apabila memuat turun fail menggunakan HttpClient

Pengenalan

Artikel ini menerangkan cara menggunakan HttpClient untuk melaksanakan bar kemajuan semasa memuat turun fail. Memandangkan DownloadOperation tidak boleh digunakan kerana had pengendalian sijil, pendekatan lain diperlukan.

Gunakan IProgress

Bermula dalam .Net 4.5, IProgress membenarkan pelaporan kemajuan tak segerak. Berikut ialah contoh cara mengintegrasikannya dengan HttpClient untuk memuat turun fail:

// Sediakan HttpClient menggunakan (var client = new HttpClient()) {

<code class="language-csharp">// 带进度报告的文件下载
await client.DownloadAsync(DownloadUrl, file, progress, cancellationToken);</code>
Salin selepas log masuk

}

Pelaksanaan kaedah sambungan

Kaedah sambungan DownloadAsync bergantung pada kaedah sambungan lain untuk replikasi strim dengan pelaporan kemajuan:

<code class="language-csharp">public static async Task DownloadAsync(this HttpClient client, string requestUri, Stream destination, IProgress<float> progress = null, CancellationToken cancellationToken = default) {

    // 获取内容长度的标头
    using (var response = await client.GetAsync(requestUri, HttpCompletionOption.ResponseHeadersRead)) {
        // 如果不支持,则忽略进度报告
        if (progress == null || !response.Content.Headers.ContentLength.HasValue) {
            await response.Content.ReadAsStreamAsync(cancellationToken).CopyToAsync(destination);
            return;
        }

        // 计算相对进度
        var relativeProgress = new Progress<long>(totalBytes => progress.Report((float)totalBytes / response.Content.Headers.ContentLength.Value));
        // 带进度报告的下载
        await response.Content.ReadAsStreamAsync().CopyToAsync(destination, 81920, relativeProgress, cancellationToken);
        progress.Report(1);
    }
}

public static async Task CopyToAsync(this Stream source, Stream destination, int bufferSize, IProgress<long> progress = null, CancellationToken cancellationToken = default) {

    var buffer = new byte[bufferSize];
    long totalBytesRead = 0;
    int bytesRead;
    while ((bytesRead = await source.ReadAsync(buffer, 0, buffer.Length, cancellationToken).ConfigureAwait(false)) != 0) {
        await destination.WriteAsync(buffer, 0, bytesRead, cancellationToken).ConfigureAwait(false);
        totalBytesRead += bytesRead;
        progress?.Report(totalBytesRead);
    }
}</code>
Salin selepas log masuk
<code>

通过以上代码,开发者可以轻松地在使用HttpClient下载文件的同时,实现进度条功能,提升用户体验。  需要注意的是,`CopyToAsync` 方法中的 `bufferSize` 参数可以根据实际情况调整,以平衡性能和内存消耗。</code>
Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimana untuk Melaksanakan Bar Kemajuan dengan HttpClient Semasa Muat Turun Fail?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan