Heim > Backend-Entwicklung > C++ > Wie implementiert man mit HttpClient einen Fortschrittsbalken beim Herunterladen von Dateien?

Wie implementiert man mit HttpClient einen Fortschrittsbalken beim Herunterladen von Dateien?

Mary-Kate Olsen
Freigeben: 2025-01-12 18:46:41
Original
529 Leute haben es durchsucht

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

Fortschrittsbalken beim Herunterladen von Dateien mit HttpClient implementieren

Einführung

In diesem Artikel wird beschrieben, wie Sie mit HttpClient einen Fortschrittsbalken beim Herunterladen von Dateien implementieren. Da DownloadOperation aufgrund von Einschränkungen bei der Zertifikatsverarbeitung nicht verwendet werden kann, ist ein anderer Ansatz erforderlich.

Verwenden Sie IProgress

Ab .Net 4.5 ermöglicht IProgress asynchrone Fortschrittsberichte. Hier ist ein Beispiel für die Integration mit HttpClient zum Herunterladen von Dateien:

// HttpClient einrichten using (var client = new HttpClient()) {

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

}

Implementierung der Erweiterungsmethode

Die DownloadAsync-Erweiterungsmethode hängt von einer anderen Erweiterungsmethode für die Stream-Replikation mit Fortschrittsberichten ab:

<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>
Nach dem Login kopieren
<code>

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

Das obige ist der detaillierte Inhalt vonWie implementiert man mit HttpClient einen Fortschrittsbalken beim Herunterladen von Dateien?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage