ASP.NET Core 3.1 - FileUpload 檔案上傳跟 .NET完整版(MVC 5)有點不同
改用 IFormFile來做,但大同小異。搭配NPOI就可以上傳檔案並讀取 Excel檔
我把以前NPOI的範例改成 .NET Core版,但在檔案上傳(FileUpload)上遇見一點問題。
ASP.NET Core .31 - FileUpload 檔案上傳跟 .NET完整版(MVC 5)有點不同
改用 IFormFile來做,但大同小異。
原廠文件就很清楚了,請看 https://docs.microsoft.com/zh-tw/aspnet/core/mvc/models/file-uploads?view=aspnetcore-3.1
上傳 + NPOI讀取 Excel檔
這個範例從 Web Form => MVC 5 => ASP.NET core寫法都差不多。
如果您要用 LinqToExcel,可以把 Excel的 "工作表"當成 DB資料表 那樣讀取,也很簡便。
== 檢視畫面 ==
為了支援檔案上傳,HTML 表單必須指定 multipart/form-data的編碼類型(enctype)。
若要支援上傳多個檔案的 files input 元素,請在 <input> 元素上提供 multiple 屬性。
這些寫法我盡量跟 MVC 5類似,初學者就不會覺得差異太大
<!-- 動作 , 控制器 -->
@using (Html.BeginForm("Create", "NPOI", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
<div class="form-horizontal">
<h4>檔案上傳 與 NPOI</h4>......基本款
<hr />
<div class="form-group">
<!-- ******************************************************************** -->
<i>這裡需要手動改成 "檔案上傳"的表單元件 type="file"</i><br />
<input type="file" id="FileUpload_FileName" name="FileUpload_FileName" />
@* 若要支援上傳多個檔案的 files input 元素,請在 <input> 元素上提供 multiple 屬性 *@
<!-- ******************************************************************** -->
</div>
<div class="form-group">
<input type="submit" value="Create(檔案上傳 與 NPOI)" class="btn btn-default" />
<h3>@ViewBag.Message</h3>
</div>
</div>
}
<!-- google_ad_client = "ca-pub-0412737137097864"; /* 728x90 */ google_ad_slot = "2295073474"; google_ad_width = 728; google_ad_height = 90; //-->
== 控制器 ==
(命名空間)
using System.IO; //-- FileStream會用到這個命名空間
using System.Text;
using Microsoft.AspNetCore.Http; //檔案上傳 IFormFile 會用到
// NPOI 2.0的命名空間 -- HSSF(Excel 2003), XSSF(Excel 2007), XWPF(Word 2007)。
using NPOI.XSSF.UserModel; //-- XSSF 用來產生Excel 2007檔案(.xlsx)
using NPOI.SS.UserModel; //-- v.1.2.4起 新增的。
//=========================================
//== 檔案上傳 與 NPOI -- 對應 Web Form的範例 -- NPOI_20_04_FileUpload.aspx
// https://docs.microsoft.com/zh-tw/aspnet/core/mvc/models/file-uploads?view=aspnetcore-3.1
//=========================================
public IActionResult Create() // 基本款
{ // 檢視畫面,為了「檔案上傳」,有些地方要自己動手修改。請看上面的「檢視畫面」。
return View();
}
[HttpPost]
public IActionResult Create(IFormFile FileUpload_FileName) // 多檔上傳,請用 List<IFormFile>
{ // **************
try
{
if (FileUpload_FileName.Length > 0) // 檢查 <input type="file"> 是否輸入檔案?
{
XSSFWorkbook workbook; // NPOI。透過 NuGet安裝,必須裝 DotNETCore專屬的NPOI版本。
using (var ms = new MemoryStream())
{
FileUpload_FileName.CopyTo(ms);
//if (ms.Length < 2097152)
//{ // 限制上傳檔案必須小於2MB。 https://docs.microsoft.com/zh-tw/aspnet/core/mvc/models/file-uploads?view=aspnetcore-3.1
//}
//*** 方法二 *** 上傳檔案,不用存檔。直接讓NOPI 讀取檔案內容(Stream串流)
Stream stream = new MemoryStream(ms.ToArray());
workbook = new XSSFWorkbook(stream); // 將剛剛的Excel (Stream)讀取到工作表裡面
//== XSSFWorkbook() 只能讀取 System.IO.Stream
}
// 讀取 Excel裡面的工作表(跟以前 MVC 5完全相同)
#region
XSSFSheet u_sheet = (XSSFSheet)workbook.GetSheetAt(0); // 0表示:第一個 worksheet工作表
StringBuilder SB = new StringBuilder(); // System.Text命名空間
XSSFRow headerRow = (XSSFRow)u_sheet.GetRow(0); //-- Excel 表頭列
// 表頭列,共有幾個 "欄位"?(取得最後一欄的數字)
for (int k = headerRow.FirstCellNum; k < headerRow.LastCellNum; k++)
{ // 把上傳的 Excel「表頭列」,每一欄位抓到
if (headerRow.GetCell(k) != null) {
SB.Append(headerRow.GetCell(k).StringCellValue + " ");
}
}
// for迴圈的「啟始值」要加一,表示不包含 Excel表頭列
for (int i = (u_sheet.FirstRowNum + 1); i <= u_sheet.LastRowNum; i++)
{ // 每一列做迴圈
XSSFRow row = (XSSFRow)u_sheet.GetRow(i); //不包含 Excel表頭列的 "其他資料列"
for (int j = row.FirstCellNum; j < row.LastCellNum; j++)
{ //-- 每一個欄位(行)做迴圈
if (row.GetCell(j) != null) {
SB.Append(row.GetCell(j).ToString() + " "); //每一個欄位
}
}
ViewBag.Message = "上傳成功。" + SB.ToString();
#endregion
}
}
}
catch {
ViewBag.Message = "上傳失敗。File upload failed!!";
}
return View();
}
完整MVC課程,第一天的影片,免費給您評估: 您可以在 Youtube看見第一天(第一 ~二節)的內容
[課程大綱] 12+1天 ASP.NET MVC 線上教學影片、線上教程 https://dotblogs.com.tw/mis2000lab/2018/08/14/ASPnet_MVC_Online_Learning_MIS2000Lab
Youtube免費觀賞 (1-1) https://youtu.be/9spaHik87-A
Facebook的 (1-1) 影片 https://www.facebook.com/mis2000lab/videos/232422547618429/
Youtube免費觀賞 (1-2) https://youtu.be/BFkIFg1iFLo
Facebook的 (1-2) 影片 https://www.facebook.com/mis2000lab/videos/344248639680066/
我將思想傳授他人, 他人之所得,亦無損於我之所有;
猶如一人以我的燭火點燭,光亮與他同在,我卻不因此身處黑暗。----Thomas Jefferson
線上課程教學,遠距教學 (Web Form 約 51hr) https://dotblogs.com.tw/mis2000lab/2016/02/01/aspnet_online_learning_distance_education_VS2015
線上課程教學,遠距教學 (ASP.NET MVC 約 140hr) https://dotblogs.com.tw/mis2000lab/2018/08/14/ASPnet_MVC_Online_Learning_MIS2000Lab
寫信給我,不要私訊 -- mis2000lab (at) yahoo.com.tw 或 school (at) mis2000lab.net
(1) 第一天 ASP.NET MVC5 完整影片(5.5小時 / .NET 4.x版)免費試聽。影片 https://youtu.be/9spaHik87-A
(2) 第一天 ASP.NET Core MVC 完整影片(3小時 / .NET Core 6.0~8.0)免費試聽。影片 https://youtu.be/TSmwpT-Bx4I
[學員感言] mis2000lab課程評價 - ASP.NET MVC , WebForm 。 https://mis2000lab.medium.com/%E5%AD%B8%E5%93%A1%E6%84%9F%E8%A8%80-mis2000lab%E8%AA%B2%E7%A8%8B%E8%A9%95%E5%83%B9-asp-net-mvc-webform-77903ce9680b
ASP.NET遠距教學、線上課程(Web Form + MVC)。 第一天課程, "完整" 試聽。
......... facebook社團 https://www.facebook.com/mis2000lab ......................
......... YouTube (ASP.NET) 線上教學影片 https://www.youtube.com/channel/UC6IPPf6tvsNG8zX3u1LddvA/
Blog文章 "附的範例" 無法下載,請看 https://dotblogs.com.tw/mis2000lab/2016/03/14/2008_2015_mis2000lab_sample_download
請看我們的「售後服務」範圍(嚴格認定)。
......................................................................................................................................................
ASP.NET MVC => .NET Core MVC 線上教學 ...... 第一天課程 完整內容 "免費"讓您評估 / 試聽
[遠距教學、教學影片] ASP.NET (Web Form) 課程 上線了!MIS2000Lab.主講 事先錄好的影片,並非上課側錄! 觀看時,有如「一對一」面對面講課。