.NET 使用 HttpClient 从 URL 下载任何类型的文件数据

news/2025/2/9 6:01:44 标签: .net, HttpClient, .NetCore

使用 HttpClient 类从 Internet URL/URI 下载文件;用 C# 编写。
本文与.NET Core 3.1、.NET 5、.NET 6和.NET 8兼容。此代码与ASP.NET Core Web 服务器应用程序同样有效。

以下代码将从 Internet URL 下载任何类型的数据,如果已压缩则解压缩,然后将其写入控制台。请参阅本文以获取有关如何从控制台应用程序(例如此应用程序)读取数据(包括二进制数据)的示例。

另请参阅:使用 WebClient 下载比 HttpClient 更简单的客户端;从端点获取请求和向端点发送 POST 请求,以使用带有REST API端点的 HttpClient

using System;
using System.IO.Compression;
using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    class Program
    {
        // NOTE: must specify that Main() be an async method
        static async Task Main(string[] args)
        {
            if(args.Length == 0)
            {
                Console.WriteLine("Must specify a URL to download");
                return;
            }

            using(var httpClient = new System.Net.Http.HttpClient())
            {

                // NOTE: to save bandwidth, request compressed content
                httpClient.DefaultRequestHeaders.AcceptEncoding.Clear();
                httpClient.DefaultRequestHeaders.AcceptEncoding.Add(new System.Net.Http.Headers.StringWithQualityHeaderValue("gzip"));
                httpClient.DefaultRequestHeaders.AcceptEncoding.Add(new System.Net.Http.Headers.StringWithQualityHeaderValue("deflate"));
                httpClient.DefaultRequestHeaders.AcceptEncoding.Add(new System.Net.Http.Headers.StringWithQualityHeaderValue("br"));

                // NOTE: accept all languages
                httpClient.DefaultRequestHeaders.AcceptLanguage.Clear();
                httpClient.DefaultRequestHeaders.AcceptLanguage.Add(new System.Net.Http.Headers.StringWithQualityHeaderValue("*"));

                // NOTE: accept all media types
                httpClient.DefaultRequestHeaders.Accept.Clear();
                httpClient.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("*/*"));

                System.Net.Http.HttpResponseMessage response;
                try
                {
                    // NOTE: argument zero may be a URL to text, like HTML, or a zip file, image file, PDF file or any other binary data
                    response = await httpClient.GetAsync(args[0]);
                    using (var ms = new MemoryStream())
                    {
                        var contentType = response.Content.Headers.ContentType.ToString().ToLower();

                        // NOTE: this block of code may be omitted; it simply writes the URL along with the content-type
                        if (contentType.StartsWith("text/"))
                        {
                            var line = args[0] + " => " + contentType;
                            Console.WriteLine(line);
                            Console.WriteLine(new string('=', line.Length));
                        }

                        await response.Content.CopyToAsync(ms);
                        byte[] data;
                        switch (response.Content.Headers.ContentEncoding.FirstOrDefault())
                        {
                            case "br":
                                data = await Decompressor.Brotli(ms);
                                break;
                            case "gzip":
                                data = await Decompressor.GZip(ms);
                                break;
                            case "deflate":
                                data = await Decompressor.Deflate(ms);
                                break;
                            default: // NOTE: not compressed
                                data = ms.ToArray();
                                break;
                        }
                        using (var msData = new MemoryStream(data))
                        {
                            msData.WriteTo(Console.OpenStandardOutput());
                        }
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                    return;
                }
            }
        }
    }
    // NOTE: this class is used to decompress data that is sent compressed, saving bandwidth
    internal class Decompressor
    {
        public static async Task<byte[]> GZip(MemoryStream inputStream, CancellationToken cancel = default)
        {
            inputStream.Position = 0;
            using (var outputStream = new MemoryStream())
            {
                using (var compressionStream = new GZipStream(inputStream, CompressionMode.Decompress))
                {
                    await compressionStream.CopyToAsync(outputStream, cancel);
                }
                return outputStream.ToArray();
            }
        }
        public static async Task<byte[]> Brotli(MemoryStream inputStream, CancellationToken cancel = default)
        {
            inputStream.Position = 0;
            using (var outputStream = new MemoryStream())
            {
                using (var compressionStream = new BrotliStream(inputStream, CompressionMode.Decompress))
                {
                    await compressionStream.CopyToAsync(outputStream, cancel);
                }
                return outputStream.ToArray();
            }
        }
        public static async Task<byte[]> Deflate(MemoryStream inputStream, CancellationToken cancel = default)
        {
            inputStream.Position = 0;
            using (var outputStream = new MemoryStream())
            {
                using (var compressionStream = new DeflateStream(inputStream, CompressionMode.Decompress))
                {
                    await compressionStream.CopyToAsync(outputStream, cancel);
                }
                return outputStream.ToArray();
            }
        }
    }
}

如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。  


http://www.niftyadmin.cn/n/5845645.html

相关文章

如何使用Xcode进行iOS应用开发?

iOS应用开发是现代移动应用开发领域的重要组成部分&#xff0c;而Xcode作为Apple官方推荐的集成开发环境&#xff08;IDE&#xff09;&#xff0c;为开发者提供了开发、调试、测试和部署iOS应用所需的一切工具。如果你是一名刚入门的iOS开发者&#xff0c;或者你准备开始开发自…

【C++】多态详细讲解

本篇来聊聊C面向对象的第三大特性-多态。 1.多态的概念 多态通俗来说就是多种形态。多态分为编译时多态(静态多态)和运⾏时多态(动态多态)。 编译时多态&#xff1a;主要就是我们前⾯讲的函数重载和函数模板&#xff0c;他们传不同类型的参数就可以调⽤不同的函数&#xff0c;通…

常用数据结构之String字符串

字符串 在Java编程语言中&#xff0c;字符可以使用基本数据类型char来保存&#xff0c;在 Java 中字符串属于对象&#xff0c;Java 提供了 String 类来创建和操作字符串。 操作字符串常用的有三种类&#xff1a;String、StringBuilder、StringBuffer 接下来看看这三类常见用…

基于JavaWeb的在线美食分享平台(源码+lw+部署文档+讲解),源码可白嫖!

摘要 本在线美食分享平台采用B/S架构&#xff0c;数据库是MySQL&#xff0c;网站的搭建与开发采用了先进的Java进行编写&#xff0c;使用了数据可视化技术、爬虫技术和Spring Boo框架。该系统从两个对象&#xff1a;由管理员和用户来对系统进行设计构建。前台主要功能包括&…

Spring Boot:简化 Java 开发的利器

Spring Boot&#xff1a;简化 Java 开发的利器 摘要&#xff1a; Spring Boot 作为 Java 开发领域的明星框架&#xff0c;以其简化配置、快速开发的特性深受开发者喜爱。本文将带你走进 Spring Boot 的世界&#xff0c;从核心优势、常用功能、项目结构、运行原理、最佳实践等方…

用Python进行websocket接口测试

这篇文章主要介绍了用Python进行websocket接口测试&#xff0c;帮助大家更好的理解和使用python&#xff0c;感兴趣的朋友可以了解下 我们在做接口测试时&#xff0c;除了常见的http接口&#xff0c;还有一种比较多见&#xff0c;就是socket接口&#xff0c;今天讲解下怎么用P…

CSP晋级组比赛生成文件夹与文件通用代码Python

快速生成文件夹与文件的脚本 import sys import osmyfiles sys.argv[1::] for f in myfiles:os.mkdir(f)os.system(f"touch {f}/{f}.in")os.system(f"touch {f}/{f}.out")os.system(f"touch {f}/{f}.cpp")with open("template.cpp",…

Open3d Qt的环境配置

Open3d Qt的环境配置 一、概述二、操作流程2.1 下载文件2.2 新建文件夹2.3 环境变量设置2.4 qt6 引用3、qt中调用4、资源下载一、概述 目前统一使用qt6配置,open3d中可视化功能目前使用vtk代替,语言为c++。 二、操作流程 2.1 下载文件 访问open3d github链接,进入releas…