System.Drawing
URIで画像形式を見つけるためにを使用する必要はありません。System.Drawing.Common NuGetパッケージをダウンロードSystem.Drawing
し.NET Core
ない限り、は利用できません。そのため、この質問に対する適切なクロスプラットフォームの回答はありません。
また、Microsoftはの使用を明示的に推奨していないため、私の例では使用しSystem.Net.WebClient
ていません。System.Net.WebClient
WebClient
新規開発のためにクラスを使用することはお勧めしません。代わりに、System.Net.Http.HttpClientクラスを使用します。
拡張子を知らずに画像をダウンロードしてファイルに書き込む(クロスプラットフォーム)*
*古いものSystem.Net.WebClient
となしSystem.Drawing
。
このメソッドは、を使用して画像(またはURIにファイル拡張子がある限り任意のファイル)を非同期でダウンロードし、URIにあるSystem.Net.Http.HttpClient
画像と同じファイル拡張子を使用してファイルに書き込みます。
ファイル拡張子の取得
ファイル拡張子を取得する最初の部分は、URIからすべての不要な部分を削除することです。UriPartial.PathでUri.GetLeftPart()
を使用して、からまでのすべてを取得します。
つまり、になります。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ディレクティブが必要です。
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
、適切に廃棄するためのドキュメントがここにあります。