iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 24
1
自我挑戰組

後端或是ASP.NET Core的學習筆記系列 第 24

第24天:實作檔案上傳功能(1)

  • 分享至 

  • xImage
  •  

檔案上傳是很常見的功能,在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鐵人賽文章@@


上一篇
第23天:分辨Model與ViewModel
下一篇
第25天:實作檔案上傳功能(2)
系列文
後端或是ASP.NET Core的學習筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言