クライアント側(.Net Standard)でExcelファイルを読んで、リスト化し、リストを引数にサーバー側へ処理を投げDB登録したいです。
Blazor WASM では「アプリがブラウザーの機能に制限されます」ということで、言い換えるとクライアント側だけではブラウザができることしかできない、すなわち、HTML5 の File API とか JavaScript が動くだけで .NET アプリが動くわけではない、なので ClosedXML を操作して Excel ファイルを読むなんてことはできないはずです。(何をどうしようと 100% 不可能・・・とまで言い切る自信はありませんが)
なので、最初の質問者さんの案、
当初、JavaScrip側でファイル選択したファイルをクライアント側(.Net Standard)からサーバー側(.Net Core3.1)へアップロードし、サーバー側でExcel処理する予定でしたが、
・・・が現実的だと思います。
jQuery / JavaScript を使ってもファイルアップロードはできますので、Blazor WASM のクライアント側だけでも同様にファイルのアップロードはできます。
jQuery / JavaScript のコードは以下の記事の View のコードの下の方を見てください。
ASP.NET Core MVC でファイルアップロード
http://surferonwww.info/BlogEngine/post/2020/01/19/aspnet-core-mvc-file-upload.aspx
jQuery / JavaScript を使ってファイルアップロードするコードを .js ファイルにまとめ、以下の記事を参考に Blazor に組み込んで呼び出すことを検討してはいかがですか?
ASP.NET Core Blazor で .NET メソッドから JavaScript 関数を呼び出す
https://learn.microsoft.com/ja-jp/aspnet/core/blazor/javascript-interoperability/call-javascript-from-dotnet?view=aspnetcore-3.1
具体的にどうするかの例を以下に書いておきます。
(1) ファイルアップロードページを作って Blazor クライアントに組み込む。
@page "/jsinterop"
@inject IJSRuntime JSRuntime;
<h1>Call JavaScript Function Example</h1>
<form id="form1" method="post" enctype="multipart/form-data" action="/Upload">
<input type="file" name="postedfile"/>
</form>
<button type="button" class="btn btn-primary" @onclick="UploadFile">
アップロード
</button>
<div id="result"></div>
<br /><br />
@code {
private async Task UploadFile()
{
await JSRuntime.InvokeVoidAsync("uploadFile");
}
}
(2) ファイルアップロード用の jQuery / JavaScript コードの js ファイルを作成。名前は任意ですがここでは exampleJsInterop.js としておきます。
window.uploadFile = () => {
// FormData オブジェクトの利用
var fd = new FormData(document.getElementById("form1"));
$.ajax({
url: '/Upload',
method: 'post',
data: fd,
processData: false, // jQuery にデータを処理させない
contentType: false // contentType を設定させない
}).done(function (response) {
$("#result").empty;
$("#result").text(response);
}).fail(function (jqXHR, textStatus, errorThrown) {
$("#result").empty;
$("#result").text('textStatus: ' + textStatus +
', errorThrown: ' + errorThrown);
});
}
(3) 上の exampleJsInterop.js と jQuery.js を Blazor クライアントの wwwroot フォルダ下に配置。
(4) wwwroot フォルダ下の index.html に exampleJsInterop.js と jQuery.js の script タグを追加する。
(5) Blazor サーバーの Controller にアップロードされたファイルを受け取って処置する API を追加。以下のような感じ。
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
namespace BlazorWasmCoreSupported.Server.Controllers
{
[Route("[controller]")]
[ApiController]
public class UploadController : ControllerBase
{
[HttpPost]
public string Post([FromForm] IFormFile postedFile)
{
string result = "";
if (postedFile != null && postedFile.Length > 0)
{
// アップロードされたファイル名を取得
string filename = System.IO.Path.GetFileName(postedFile.FileName);
// アップロードされたファイルを処理(省略)
result = $"{filename} ({postedFile.ContentType}) - " +
$"{postedFile.Length} bytes アップロード完了";
}
else
{
result = "ファイルアップロードに失敗しました";
}
return result;
}
}
}
アプリを実行してファイルアップロードに成功すると以下のようになります。