前提
BlazorWebAssembly(フレームワーク.Net Standard2.1)より呼び出したJavaScriptからサーバーへExcelファイルをアップロードしたい
実現したいこと
サーバー側のフォルダへアップロードしたExcelファイルを一時保存し、操作したい
発生している問題・エラーメッセージ
Excelファイル名はサーバーへ渡るが、アップロードしたはずのExcelファイルが読み込めない。
ご教授頂きたいです。
該当のソースコード
Blazor(Client側)
1@inject HttpClient Http 2@inject IJSRuntime JSRuntime 3 <button title="ファイル取込" @onclick="(async () => await UpLoadFileAsync())" disabled="@false" > 4 ファイル取込 5 </button> 6@code { 7 async Task UpLoadFileAsync() 8 { 9 // ダイアログのインスタンスを生成 10 var fileurl = await JSRuntime.InvokeAsync<string>("showOpenFileDialog").ConfigureAwait(false); 11 } 12}
JavaScript
1//ファイルを開く 2022.10.20 add 2function showOpenFileDialog() { 3 const createOpenFileDialog = () => { 4 return new Promise(resolve => { 5 const input = document.createElement('input'); 6 var form = document.createElement('form'); 7 8 form.id = 'form_fileupload'; 9 form.method = 'post'; 10 form.enctype = 'multipart/form-data'; 11 form.action = '/api/NyukaYoteiTourokuSaveFile/LoadExcel'; 12 13 input.type = 'file'; 14 input.accept = '.xlsx'; 15 form.appendChild(input); 16 input.onchange = event => { resolve(event.target.files[0]); }; 17 input.click(); 18 }); 19 }; 20 21 return new Promise(resolve => { 22 resolve(createOpenFileDialog() 23 .then((response) => { 24 25 var blob = new Blob([response.buffer], { type: "application/octet-stream" }); 26 var formData = new FormData(); 27 formData.append("postedFile", blob, response.name); 28 29 // var formData = new FormData(document.getElementById("form_fileupload")); 30 return formData; 31 32 }).then(function (formData) { 33 34 $.ajax({ 35 url: '/api/NyukaYoteiTourokuSaveFile/LoadExcel', 36 // method: 'post', 37 type: 'post', 38 data: formData, 39 processData: false, // jQuery にデータを処理させない 40 contentType: false // contentType を設定させない 41 }).done(function (response) { 42 window.alert("通信成功"); 43 }).fail(function (jqXHR, textStatus, errorThrown) { 44 window.alert("通信失敗"); 45 }); 46 47 return "test"; 48 })); 49 50 });
Blazor(Server側)
1 [HttpPost("LoadExcel")] 2 public void PostExcelAsync([FromForm] IFormFile postedFile) 3 4 //public void GetExcelAsync(string fileurl) 5 { 6 string result = ""; 7 if (postedFile != null && postedFile.Length > 0) 8 { 9 string typ = postedFile.ContentType; 10 11 // アップロードされたファイル名を取得 12 //string filename = Path.GetFileName(postedFile.FileName); 13 string filename = postedFile.FileName; 14 var ExcelFilePath = Path.Combine(Directory.GetCurrentDirectory(), "Import", "Book.xlsx"); 15 using (var stream = System.IO.File.Create(ExcelFilePath)) 16 { 17 postedFile.CopyTo(stream); 18 } 19 20 // アップロードされたファイルを処理(省略) 21 22 result = $"{filename} ({postedFile.ContentType}) - " + 23 $"{postedFile.Length} bytes アップロード完了"; 24 } 25 else 26 { 27 result = "ファイルアップロードに失敗しました"; 28 } 29 30 return; 31
試したこと
サーバー側で指定したExcelファイルは出来るが、直接Excelファイルをクリックして開こうとしても開かない。
その為、サーバー側のソースからも読み込めない。
JavaScript側のformData.appendが間違っていると思われますが、正しいセットの仕方が分からないです。
JavaScriptによる以下のコマンドだとエラーが発生します。
var formData = new FormData(document.getElementById("form_fileupload"));
◆Fiddlerでの解析(HexView)
ファイル選択時
POST http://localhost:5000/api/NyukaYoteiTourokuSaveFile/LoadExcel HTTP/1.1
Host: localhost:5000
Connection: keep-alive
Content-Length: 215
sec-ch-ua: "Microsoft Edge";v="107", "Chromium";v="107", "Not=A?Brand";v="24"
Accept: /
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryP4OANBiTG5BB8aR4
X-Requested-With: XMLHttpRequest
sec-ch-ua-mobile: ?0
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 Edg/107.0.1418.35
sec-ch-ua-platform: "Windows"
Origin: http://localhost:5000
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: cors
Sec-Fetch-Dest: empty
Referer: http://localhost:5000/nyukaYoteiTourokuFile
Accept-Encoding: gzip, deflate, br
Accept-Language: ja,en;q=0.9,en-GB;q=0.8,en-US;q=0.7
------WebKitFormBoundaryP4OANBiTG5BB8aR4
Content-Disposition: form-data; name="postedFile"; filename="testExl.xlsx"
Content-Type: application/octet-stream
undefined
------WebKitFormBoundaryP4OANBiTG5BB8aR4--
Ajax通信時?
POST https://vortex.data.microsoft.com/collect/v1 HTTP/1.1
Content-Type: application/x-json-stream
Content-Encoding: gzip
Host: vortex.data.microsoft.com
Content-Length: 5449
Expect: 100-continue
Connection: Keep-Alive
補足情報(FW/ツールのバージョンなど)
BlazorWebAssemblyアプリでASP.NET Coreでホストされた環境
クライアント側: .Net Standard2.1
サーバー側: Net Core3.1
回答1件
あなたの回答
tips
プレビュー