Es ist nicht erforderlich, System.Drawing
das Bildformat in einer URI zu suchen. System.Drawing
ist nur verfügbar, .NET Core
wenn Sie das System.Drawing.Common NuGet-Paket herunterladen. Daher sehe ich keine guten plattformübergreifenden Antworten auf diese Frage.
Außerdem wird mein Beispiel nicht verwendet, System.Net.WebClient
da Microsoft ausdrücklich von der Verwendung von abrätSystem.Net.WebClient
.
Wir empfehlen nicht, die WebClient
Klasse für Neuentwicklungen zu verwenden. Verwenden Sie stattdessen die Klasse System.Net.Http.HttpClient .
Laden Sie ein Bild herunter und schreiben Sie es in eine Datei, ohne die Erweiterung zu kennen (plattformübergreifend) *
* Ohne alt System.Net.WebClient
und System.Drawing
.
Diese Methode lädt asynchron ein Bild (oder eine beliebige Datei, solange der URI eine Dateierweiterung hat) mit dem herunter System.Net.Http.HttpClient
und schreibt es dann in eine Datei mit derselben Dateierweiterung wie das Bild im URI.
Abrufen der Dateierweiterung
Der erste Teil des Abrufs der Dateierweiterung besteht darin, alle unnötigen Teile aus dem URI zu entfernen.
Wir verwenden Uri.GetLeftPart () mit UriPartial.Path, um alles von Scheme
oben bis unten zu erhalten Path
.
Mit anderen Worten, https://www.example.com/image.png?query&with.dots
wird https://www.example.com/image.png
.
Danach verwenden wir Path.GetExtension () , um nur die Erweiterung abzurufen ( in meinem vorherigen Beispiel .png
).
var uriWithoutQuery = uri.GetLeftPart(UriPartial.Path);
var fileExtension = Path.GetExtension(uriWithoutQuery);
Bild herunterladen
Von hier sollte es einfach sein. Laden Sie das Image mit HttpClient.GetByteArrayAsync herunter , erstellen Sie den Pfad, stellen Sie sicher, dass das Verzeichnis vorhanden ist, und schreiben Sie die Bytes mit File.WriteAllBytesAsync () in den Pfad (oder File.WriteAllBytes
wenn Sie sich in .NET Framework befinden).
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);
}
Beachten Sie, dass Sie mithilfe von Anweisungen Folgendes benötigen.
using System;
using System.IO;
using System.Threading.Tasks;
using System.Net.Http;
Anwendungsbeispiel
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));
Anmerkungen
- Es ist eine schlechte Praxis,
HttpClient
für jeden Methodenaufruf eine neue zu erstellen . Es soll während der gesamten Anwendung wiederverwendet werden. Ich habe ein kurzes Beispiel eines ImageDownloader
(50 Zeilen) mit mehr Dokumentation geschrieben, das das hier wiederverwendet HttpClient
und ordnungsgemäß entsorgt, das Sie hier finden .