📦
サーバからファイルを受け取る (Blazor Server)
はじめに
この記事は、以下を下敷きにしています。
以降で挙げるコードの詳細は、次のリポジトリをご参照ください。
やりたいこと
サーバ側で動的に生成されたファイルを受け取りたいです。
サーバに渡す場合は以下をどうぞ。
実装
実装例
この例のファイルは比較的小さいので、URLを割り当てず、ストリームからダウンロードします。
これは、250MB未満のファイルに対して推奨される方法で、このコードは、ほぼ、以下のリンク先にあるサンプルのままです。
250MB以上の場合は、URLからダウンロードすることが推奨されています。
URLは無作為な識別子をルートパラメータで受け渡せば良いでしょうか。
生成とダウンロードが離れてしまうので、一時ファイルの削除が面倒ですね。
使用例
(.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