📦

サーバからファイルを受け取る (Blazor Server)

に公開

はじめに

この記事は、以下を下敷きにしています。

https://zenn.dev/tetr4lab/articles/6b1a70ca7800ed

以降で挙げるコードの詳細は、次のリポジトリをご参照ください。

https://github.com/tetr4lab/Novels

やりたいこと

サーバ側で動的に生成されたファイルを受け取りたいです。

サーバに渡す場合は以下をどうぞ。
https://zenn.dev/tetr4lab/articles/5b875f53d04e3a

実装

実装例

この例のファイルは比較的小さいので、URLを割り当てず、ストリームからダウンロードします。

https://github.com/tetr4lab/Novels/blob/87bd0a3f6030cca270a6f9ab080cdc8499f73bcc/Novels/Novels/wwwroot/js/NovelsUtilities.js#L36-L46

これは、250MB未満のファイルに対して推奨される方法で、このコードは、ほぼ、以下のリンク先にあるサンプルのままです。

https://learn.microsoft.com/ja-jp/aspnet/core/blazor/file-downloads#download-from-a-stream

250MB以上の場合は、URLからダウンロードすることが推奨されています。
URLは無作為な識別子をルートパラメータで受け渡せば良いでしょうか。
生成とダウンロードが離れてしまうので、一時ファイルの削除が面倒ですね。

使用例

https://github.com/tetr4lab/Novels/blob/87bd0a3f6030cca270a6f9ab080cdc8499f73bcc/Novels/Novels/Components/Pages/Publish.razor.cs#L215-L225

(.razor.csは非対応か…)

try {
    using (var fileStream = new FileStream (epubPath, FileMode.Open))
    using (var streamRef = new DotNetStreamReference (stream: fileStream)) {
        await JSRuntime.InvokeVoidAsync ("downloadFileFromStream", title, streamRef);
    }
}
catch (Exception e) {
    System.Diagnostics.Debug.WriteLine ($"Exception: {e.Message}\n{e.StackTrace}");
    Snackbar.Add ($"Exception: {e.Message}", Severity.Error);
    Snackbar.Add ($"『{title}』の取得に失敗しました。", Severity.Error);
}

単純にストリーム間で受け渡す感じです。

サイズが小さいならファイルにせずメモリストリームの方が後始末の面倒がないと思うのですが、この例では、前段の生成ライブラリがファイルにしか対応していなかったのでこうなっています。

おわりに

お読みいただきありがとうございました。
執筆者は、Blazor、ASP.NETなど諸々において初学者ですので、誤りもあるかと思います。
お気づきの際は、是非コメントや編集リクエストにてご指摘ください。
あるいは、「それでも解らない」、「自分はこう捉えている」などといった、ご意見、ご感想も歓迎いたします。

Discussion