System.Drawing
Görüntü formatını bir URI'de bulmak için kullanılması gerekli değildir . System.Drawing.Common NuGet paketini indirmediğiniz sürece System.Drawing
kullanılamaz ve bu nedenle bu soruya herhangi bir iyi platformlar arası yanıt göremiyorum..NET Core
Ayrıca, benim örnek kullanmaz System.Net.WebClient
çünkü Microsoft, açıkça kullanımından kaçınılmasıSystem.Net.WebClient
.
WebClient
Sınıfı yeni geliştirme için kullanmanızı önermiyoruz . Bunun yerine System.Net.Http.HttpClient sınıfını kullanın .
Bir görüntüyü indirin ve uzantısını bilmeden bir dosyaya yazın (çapraz platform) *
* Eskisiz System.Net.WebClient
ve System.Drawing
.
Bu yöntem, bir görüntüyü (veya URI'nin bir dosya uzantısına sahip olduğu sürece herhangi bir dosyayı) eşzamansız olarak indirir System.Net.Http.HttpClient
ve ardından URI'de görüntünün sahip olduğu aynı dosya uzantısını kullanarak bir dosyaya yazar.
Dosya uzantısını alma
Dosya uzantısını almanın ilk kısmı, tüm gereksiz parçaları URI'den kaldırmaktır.
Biz kullanmak Uri.GetLeftPart () kadar her şeyi almak için UriPartial.Path ile Scheme
karşı up Path
.
Başka bir deyişle, https://www.example.com/image.png?query&with.dots
olur https://www.example.com/image.png
.
Bundan sonra, yalnızca uzantıyı (önceki örneğimde) elde etmek için Path.GetExtension () kullanıyoruz .png
.
var uriWithoutQuery = uri.GetLeftPart(UriPartial.Path);
var fileExtension = Path.GetExtension(uriWithoutQuery);
Görselin indirilmesi
Buradan itibaren dümdüz olmalı. Görüntüyü HttpClient.GetByteArrayAsync ile indirin, yolu oluşturun, dizinin var olduğundan emin olun ve ardından baytları File.WriteAllBytesAsync () ile yola yazın (veya File.WriteAllBytes
.NET Framework kullanıyorsanız)
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);
}
Aşağıdaki kullanım yönergelerine ihtiyacınız olduğunu unutmayın.
using System;
using System.IO;
using System.Threading.Tasks;
using System.Net.Http;
Örnek kullanım
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));
Notlar
HttpClient
Her yöntem çağrısı için yeni bir tane oluşturmak kötü bir uygulamadır . Uygulama boyunca yeniden kullanılması gerekiyor. Burada bulabileceğiniz ImageDownloader
, doğru şekilde yeniden kullanan HttpClient
ve düzgün bir şekilde elden çıkaran daha fazla dokümantasyon içeren (50 satır) kısa bir örnek yazdım .