Ini tidak perlu digunakan System.Drawinguntuk menemukan format gambar dalam URI. System.Drawingtidak tersedia .NET Corekecuali Anda mengunduh paket System.Drawing.Common NuGet dan oleh karena itu saya tidak melihat jawaban lintas platform yang baik untuk pertanyaan ini.
Selain itu, contoh saya tidak digunakan System.Net.WebClientkarena Microsoft secara eksplisit melarang penggunaanSystem.Net.WebClient .
Kami tidak menyarankan Anda menggunakan WebClientkelas untuk pengembangan baru. Sebagai gantinya, gunakan kelas System.Net.Http.HttpClient .
Unduh gambar dan tulis ke file tanpa mengetahui ekstensi (lintas platform) *
* Tanpa tua System.Net.WebClientdan System.Drawing.
Metode ini akan mengunduh gambar secara asinkron (atau file apa pun selama URI memiliki ekstensi file) menggunakan System.Net.Http.HttpClientdan kemudian menulisnya ke file, menggunakan ekstensi file yang sama seperti gambar di URI.
Mendapatkan ekstensi file
Bagian pertama untuk mendapatkan ekstensi file adalah menghapus semua bagian yang tidak diperlukan dari URI.
Kami menggunakan Uri.GetLeftPart () dengan UriP Partial.Path untuk mendapatkan semuanya mulai dari yang Schemeatas hingga Path.
Dengan kata lain, https://www.example.com/image.png?query&with.dotsmenjadi https://www.example.com/image.png.
Setelah itu, kami menggunakan Path.GetExtension () untuk hanya mendapatkan ekstensi (dalam contoh saya sebelumnya, .png).
var uriWithoutQuery = uri.GetLeftPart(UriPartial.Path);
var fileExtension = Path.GetExtension(uriWithoutQuery);
Mendownload gambar
Dari sini harus lurus ke depan. Unduh gambar dengan HttpClient.GetByteArrayAsync , buat jalur, pastikan direktori ada dan kemudian tulis byte ke jalur dengan File.WriteAllBytesAsync () (atau File.WriteAllBytesjika Anda menggunakan .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);
}
Perhatikan bahwa Anda memerlukan yang berikut menggunakan arahan.
using System;
using System.IO;
using System.Threading.Tasks;
using System.Net.Http;
Contoh penggunaan
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));
Catatan
- Merupakan praktik yang buruk untuk membuat yang baru
HttpClientuntuk setiap pemanggilan metode. Itu seharusnya digunakan kembali di seluruh aplikasi. Saya menulis contoh singkat ImageDownloader(50 baris) dengan lebih banyak dokumentasi yang menggunakan kembali dengan HttpClientbenar dan membuangnya dengan benar yang dapat Anda temukan di sini .