不必用于System.Drawing
在URI中查找图像格式。除非您下载System.Drawing.Common NuGet包System.Drawing
,.NET Core
否则此功能不可用,,因此,我看不到此问题的任何跨平台的好答案。
另外,System.Net.WebClient
由于Microsoft明确禁止使用System.Net.WebClient
,因此我的示例没有使用。
我们不建议您将该WebClient
类用于新开发。而是使用System.Net.Http.HttpClient类。
下载图像并将其写入文件而无需扩展名(跨平台)*
*没有旧System.Net.WebClient
和System.Drawing
。
此方法将使用异步下载图片(或只要URI具有文件扩展名的任何文件)System.Net.Http.HttpClient
,然后使用与URI中图片相同的文件扩展名将其写入文件。
获取文件扩展名
获取文件扩展名的第一步是从URI中删除所有不必要的部分。
我们使用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()将字节写入路径(File.WriteAllBytes
如果您使用的是.NET Framework)
private async Task DownloadImageAsync(string directoryPath, string fileName, Uri uri)
{
using var httpClient = new HttpClient();
// Get the file extension
var uriWithoutQuery = uri.GetLeftPart(UriPartial.Path);
var fileExtension = Path.GetExtension(uriWithoutQuery);
// Create file path and ensure directory exists
var path = Path.Combine(directoryPath, $"{fileName}{fileExtension}");
Directory.CreateDirectory(directoryPath);
// Download the image and write to the file
var imageBytes = await _httpClient.GetByteArrayAsync(uri);
await File.WriteAllBytesAsync(path, imageBytes);
}
请注意,您需要以下using指令。
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
和正确处理它,您可以在这里找到。