檔案上傳是很常見的功能,在ASP.NET Core上要撰寫這個功能也非常簡單。
首先要在view的from表單中增加一個輸入欄位來讓使用者選擇要上傳的檔案,而後在Controller Action中加一個參數來接受使用者上傳的檔案。後端接受到檔案後儲存起來就完成了。
首先在view的from表單新增一個input元素,指定type為file,這是html原生的上傳檔案方式。我們一樣可以對這個input繫結到一個型別屬性。此外因為要上傳檔案,所以要把From表單送出編碼從預設值的對文字編碼(application/x-www-form-urlencoded)改設定成multipart/form-data。
不過目前在AddProduct.cshtml宣告的是@model Product,Product.cs這個類別是對應到資料庫的Product資料表,裡面目前只有ID、Name、Price三個屬性,要多個input就要多個新屬性。實務上是不會把檔案存放在資料庫(就算資料庫有存檔案的功能),而是會準備一個地方(例如某個資料夾)來存放檔案。所以我們可以幫AddProduct.cshtml建立一個專用的資料型別,這裡取名為AddProductViewModel.cs,裡面有Name、Price兩個屬性(因為是新增Product所以View不用ID這個屬性),還要加入一個File屬性來代表前端傳來的檔案,型別為IFormFile
。產生的AddProductViewModel.cs(在Models資料夾裡建立一個ViewModels資料夾裡面),如下:
public class AddProductViewModel
{
public string Name { get; set; }
public decimal Price { get; set; }
public FormFile File { get; set; }
}
並且在view中的@model宣告為AddProductViewModel,不過我的C#編譯器不曉得我的AddProductViewModel在哪裡,所以這裡我連同namespace都加上去,整個View最少會這樣:
@model WebApplication8.Models.ViewModels.AddProductViewModel;
<form asp-action="AddProduct" enctype="multipart/form-data">
<label asp-for="Name"></label>
<input asp-for="Name" type="text" />
<label asp-for="Price"></label>
<input asp-for="Price" type="text" />
<label asp-for="File"></label>
<input asp-for="File" type="file">
<input type="submit" value="送出" />
</form>
而Controller的AddProduct Action要接受繫結的參數與名稱,也要從Product改成AddProductViewModel。
[HttpPost]
public IActionResult AddProduct(AddProductViewModel productViewModel)
{
...
}
今天先做到這邊,我要先去趕下Angular鐵人賽文章@@