Ini tidak perlu digunakan System.Drawing
untuk menemukan format gambar dalam URI. System.Drawing
tidak tersedia .NET Core
kecuali 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.WebClient
karena Microsoft secara eksplisit melarang penggunaanSystem.Net.WebClient
.
Kami tidak menyarankan Anda menggunakan WebClient
kelas 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.WebClient
dan System.Drawing
.
Metode ini akan mengunduh gambar secara asinkron (atau file apa pun selama URI memiliki ekstensi file) menggunakan System.Net.Http.HttpClient
dan 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 Scheme
atas hingga Path
.
Dengan kata lain, https://www.example.com/image.png?query&with.dots
menjadi 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.WriteAllBytes
jika 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
HttpClient
untuk 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 HttpClient
benar dan membuangnya dengan benar yang dapat Anda temukan di sini .