SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

マルチターゲットアプリ開発の新しいアプローチ~.NET 9 新テンプレートの基本~

.NET MAUI Blazorで生成した画像を保存する。ネイティブ機能との連携

マルチターゲットアプリ開発の新しいアプローチ~.NET 9 新テンプレートの基本~ 第5回

MAUI:画像保存の実装(FileSaver)

 まずは、MAUIプロジェクトの実装を行います。

CommunityToolkit.MAUI

 MAUI側では、CommunityToolkit.MAUIライブラリのFileSaverを利用しました。このライブラリは、各プラットフォームのネイティブなファイル保存機能をラップしたAPIを提供します。

 ImageGeneratorプロジェクトに、CommunityToolkit.Mauiをインストールします。ソリューションエクスプローラーのImageGeneratorプロジェクトで右クリックし、メニューから[NuGetパッケージの管理]を選びます。参照タブでCommunityToolkit.Mauiを検索し、インストールします。

 なお、最新バージョンは13.0ですが、筆者の作成時のプロジェクトでは、対応していないようで、バージョン12.3をインストールしました。

 インストール後、MauiProgram.csで初期化処理を追加します。

[リスト2]MauiProgram.csの一部
using CommunityToolkit.Maui;

public static class MauiProgram
{
    public static MauiApp CreateMauiApp()
    {
        var builder = MauiApp.CreateBuilder();
        builder
            .UseMauiApp<App>()
            .UseMauiCommunityToolkit()  // 追加
            .ConfigureFonts(fonts =>
            {
                fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
            });
            ~中略~
    }
}

IHttpClientFactory

 今回の実装では、HTTP通信を行うコードが複数あります。HttpClientクラスは、その都度インスタンスを生成すると、ソケットの枯渇などの問題が発生する可能性があります。.NETでは、IHttpClientFactoryを使用してHttpClientインスタンスを管理することが推奨されています。

 IHttpClientFactoryを使うと、HttpClientの生成と破棄を任せることができ、インスタンスの問題を気にする必要がなくなります。またDIコンテナに登録することで、アプリケーション全体で安全にHttpClientを使用できます。

HttpClientの登録

 CommunityToolkit.MAUIライブラリ同様、NuGetパッケージの管理から、Microsoft.Extensions.Httpパッケージを追加します。それから、MauiProgram.csに、IHttpClientFactoryを登録するコードを追加します。

[リスト3]MauiProgram.csの一部
// 第3回で登録したサービス
builder.Services.AddSingleton<IImageGenerationService, OpenAIImageService>();

// HttpClientFactoryの登録
builder.Services.AddHttpClient();

 AddHttpClient()を呼び出すことで、IHttpClientFactoryがDIコンテナに登録されます。

実装クラスの作成

 MAUIの実装クラスとして、MauiImageSaveServiceクラスをImageGeneratorプロジェクトのServicesフォルダに新規作成します。

[リスト4]MauiImageSaveService.cs
using CommunityToolkit.Maui.Storage;

public class MauiImageSaveService(IHttpClientFactory httpClientFactory) : IImageSaveService
{
    public string ActionLabel => "保存";  // UI文言の設定 (4)

    public async Task<bool> SaveImageAsync(string imageUrl, string fileName, object? jsRuntime = null)
    {
        // jsRuntimeはMAUI環境では使用しない
        try
        {
            // HttpClientFactoryからHttpClientを取得 (1)
            using var httpClient = httpClientFactory.CreateClient();
            
            // 画像データをダウンロード (2)
            var imageBytes = await httpClient.GetByteArrayAsync(imageUrl);

            // FileSaverを使って保存 (3)
            using var stream = new MemoryStream(imageBytes);
            var result = await FileSaver.Default.SaveAsync(fileName, stream, default);

            return result.IsSuccessful;
        }
        catch (Exception ex)
        {
            Console.WriteLine($"画像保存エラー: {ex.Message}");
            return false;
        }
    }
}

 IHttpClientFactoryをコンストラクタで受け取り(プライマリコンストラクタ構文)、CreateClientメソッドでHttpClientを取得します(1)。このHttpClientは内部で接続プールが管理され、効率的に再利用されます。GetByteArrayAsyncメソッドで画像URLからバイナリデータをダウンロードし(2)、FileSaverオブジェクトを使ってデバイスに保存します(3)。なお、jsRuntime引数はMAUI環境では使用しません。

 また、UIで使う文言プロパティを設定しておきます(4)。

次のページ
Web:画像ダウンロードの実装(JS連携)

この記事は参考になりましたか?

マルチターゲットアプリ開発の新しいアプローチ~.NET 9 新テンプレートの基本~連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト 高江 賢(タカエ ケン)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/23143 2026/02/03 08:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング