Maison >développement back-end >C++ >Comment implémenter une barre de progression avec HttpClient lors des téléchargements de fichiers ?

Comment implémenter une barre de progression avec HttpClient lors des téléchargements de fichiers ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2025-01-12 18:46:41530parcourir

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

Implémenter la barre de progression lors du téléchargement de fichiers à l'aide de HttpClient

Présentation

Cet article décrit comment utiliser HttpClient pour implémenter une barre de progression lors du téléchargement de fichiers. Étant donné que DownloadOperation ne peut pas être utilisé en raison de limitations de gestion des certificats, une autre approche est requise.

Utiliser IProgress

À partir de .Net 4.5, IProgress permet des rapports de progression asynchrones. Voici un exemple de la façon de l'intégrer à HttpClient pour le téléchargement de fichiers :

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

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

}

Implémentation de la méthode d'extension

La méthode d'extension DownloadAsync dépend d'une autre méthode d'extension pour la réplication de flux avec rapport de progression :

<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>
<code>

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

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn