.NET多年来发生了一些变化,因此本帖中的其他答案已经有些过时:
我们不建议您在新开发中使用WebClient
类。 相反,请使用System.Net.Http.HttpClient类。
.NET Core异步解决方案
获取文件扩展名
获取文件扩展名的第一步是从URL中删除所有不必要的部分。我们可以使用Uri.GetLeftPart()和UriPartial.Path,从Scheme
到Path
获取所有内容。
换句话说,https://www.example.com/image.png?query&with.dots
变成了 https://www.example.com/image.png
。
之后,我们可以使用Path.GetExtension()仅获取扩展名(在我的上一个示例中,.png
)。
var uriWithoutQuery = uri.GetLeftPart(UriPartial.Path);
var fileExtension = Path.GetExtension(uriWithoutQuery);
下载镜像
接下来应该很简单。使用HttpClient.GetByteArrayAsync下载镜像,创建路径,确保目录存在,然后使用File.WriteAllBytesAsync()将字节写入路径。
private async Task DownloadImageAsync(string directoryPath, string fileName, Uri uri)
{
using var httpClient = new HttpClient();
var uriWithoutQuery = uri.GetLeftPart(UriPartial.Path);
var fileExtension = Path.GetExtension(uriWithoutQuery);
var path = Path.Combine(directoryPath, $"{fileName}{fileExtension}");
Directory.CreateDirectory(directoryPath);
var imageBytes = await httpClient.GetByteArrayAsync(uri);
await File.WriteAllBytesAsync(path, imageBytes);
}
请注意,您需要以下使用指示符。
using System;
using System.IO;
using System.Threading.Tasks;
using System.Net.Http;
使用示例
var folder = "images";
var fileName = "test";
var url = "https://cdn.discordapp.com/attachments/458291463663386646/592779619212460054/Screenshot_20190624-201411.jpg?query&with.dots";
await DownloadImageAsync(folder, fileName, new Uri(url));
备注
- 每次调用方法创建新的
HttpClient
是不好的做法。它应该在整个应用程序中被重复使用。我写了一个简短的示例ImageDownloader
(50行),附有更多文档,正确地重用HttpClient
并正确处理其释放问题,您可以在这里找到。