Не потрібно використовувати System.Drawing
для пошуку формату зображення в URI. System.Drawing
недоступний, .NET Core
якщо ви не завантажите пакет System.Drawing.Common NuGet, і тому я не бачу хороших міжплатформних відповідей на це питання.
Також мій приклад не використовується, 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 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
та правильно розпоряджається нею, яку ви можете знайти тут .