【问题标题】:Download file from url and convert to base64 async (C#)从 url 下载文件并转换为 base64 异步(C#)
【发布时间】:2021-07-19 17:46:10
【问题描述】:

我有需要下载文件并转换为base64字符串的网址

我为此编写了这段代码

private string GetImageAsBase64(string url)
    {
        using (var client = new WebClient())
        {
            var bytes = client.DownloadData(url);
            var base64String = Convert.ToBase64String(bytes);
            return base64String;
        }
    }

如何使其异步使用返回类型Task<string>

【问题讨论】:

  • 请注意 Microsoft discourages the use of WebClient 获取新代码。
  • 好的,如果没有WebClient,我该怎么做呢? @Fildor
  • 使用具有异步 API 的 HttpClient 作为其中之一。然后你可以看到如何使编码部分异步。
  • @EugeneSukh 链接文章的评论说:“相反,使用 System.Net.Http.HttpClient 类。” - 大而大胆。看了基本不会错过。

标签: c# asp.net asp.net-core


【解决方案1】:

即使这个问题已经回答了,如上所述。

我认为你需要这样的东西:

 private async Task<string> GetImageAsBase64(string url)
    {
        using (var client = new WebClient())
        {
            var bytes = await client.DownloadDataTaskAsync(url);
            var base64String = Convert.ToBase64String(bytes);
            return base64String;
        }
    }

【讨论】:

  • 如前所述,最好不要使用 WebClient 怎么办,使用 HttpClient?
  • @EugeneSukh 我建议实际阅读The Documentation,因为它甚至包含代码示例
  • “即使这个问题已经得到回答,如上所述。” - 链接的问题并不完全相同,而且最重要的是:高度赞成的接受答案是 糟糕的从今天的角度来看的建议。
【解决方案2】:

你快到了,使用GetByteArrayAsync

private async Task<string> GetImageAsBase64Async(string url) // return Task<string>
{
    using (var client = new HttpClient())
    {
        var bytes = await client.GetByteArrayAsync(url); // there are other methods if you want to get involved with stream processing etc
        var base64String = Convert.ToBase64String(bytes);
        return base64String;
    }
}

UPD

正如@Fildor 指出的那样,您希望将HttpClient 实例化一次并将其注入函数中。一种非常幼稚的方法是使用扩展方法:

void Main()
{
    HttpClient client = new HttpClient(); // can reuse
    client.GetImageAsBase64("...");
    client.GetImageAsBase64("...");
    client.GetImageAsBase64("...");
}

static class HttpclientExtensions
{
    public static async Task<string> GetImageAsBase64(this HttpClient client, string url)
    {
        var bytes = await client.GetByteArrayAsync(url);
        return Convert.ToBase64String(bytes);
    }
}

【讨论】:

  • OP:请注意,您不应该使用using (var client = new HttpClient())。要么有一个静态 HttpClient 要么使用依赖注入(使用IHttpClientFactory)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-15
  • 1970-01-01
  • 2013-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多