将文件从url下载到.Net Core中的本地设备

Rav*_*avi 14 c# .net-core asp.net-core

在.Net 4.0中,我使用WebClient从URL下载文件并将其保存在本地驱动器上.但是我无法在.Net Core中实现相同的功能.

任何人都可以帮我解决这个问题吗?

jAC*_*jAC 21

WebClient不可用.NET Core.(UPDATE:它是从2.0)的使用HttpClient在System.Net.Http因此强制性:

using System.Net.Http;
using System.Threading.Tasks;
...
public static async Task<byte[]> DownloadFile(string url)
{
    using (var client = new HttpClient())
    {

        using (var result = await client.GetAsync(url))
        {
            if (result.IsSuccessStatusCode)
            {
                return await result.Content.ReadAsByteArrayAsync();
            }

        }
    }
    return null;
}
Run Code Online (Sandbox Code Playgroud)

  • 对于读者,请注意,您不应该以这种方式使用HttpClient。一种选择是让HttpClientFactory处理Httpclient对象的生存期。阅读[更多](/sf/ask/3563851231/) (2认同)

小智 8

在NetCore 6.0中,您应该使用已过时的HttpClient代替WebClient,并且您在新类中拥有异步方法File。

实现简单如下:

static async Task DownloadFile(string url, string pathToSave, string fileName)
{
    var content = await GetUrlContent(url);
    if (content != null)
    {
        if (!Directory.Exists(pathToSave)) Directory.CreateDirectory(pathToSave);
        await File.WriteAllBytesAsync($"{pathToSave}/{fileName}", content);
    }
}

static async Task<byte[]?> GetUrlContent(string url)
{
    using (var client = new HttpClient())
    using (var result = await client.GetAsync(url))
        return result.IsSuccessStatusCode ? await result.Content.ReadAsByteArrayAsync():null;
}
Run Code Online (Sandbox Code Playgroud)

用法:

await DownloadFile("https://exampl.com/image.jpg", @"c:\DownloadedImages", "image.jpg");
Run Code Online (Sandbox Code Playgroud)

  • 这个答案几乎是完美的,但是通常不认为直接使用构造函数实例化 HttpClient 是最佳实践,除非您确定在应用程序生命周期中只会执行一次。最好构造一个单例以供重用或使用 IHttpClientFactory (个人最喜欢)。更多信息请参见:https://learn.microsoft.com/en-us/dotnet/fundamentals/networking/httpclient-guidelines (4认同)

Edu*_*eni 6

WebClient可从.net core 2.0获得

var wc = new System.Net.WebClient();
wc.DownloadFile( URL, @"c:\temp\myfile.txt");
Run Code Online (Sandbox Code Playgroud)

  • 您有“DownloadFileAsync”方法(这是.net core) (2认同)