這邊來簡單講一下檔案上傳如何Binding資料,通常各大網站都會支援上傳功能,net core下當然也提供。
支援多檔上傳,input的name必須設定跟後端接的property一樣,用form包起來,submit後丟到後端controller,這邊使用List接收多個檔案,如果只有一個也可以使用IFormFile這個類別接收就好。
MVC範例:
View
<form id="form" method="post" enctype="multipart/form-data" action="@Url.Action("SaveData","Test")">
<input name="file1" id="file" type="file" class="fileGrp" />
<input type="submit" value="送出" />
</form>
Controller
public IActionResult SaveData(List<IFormFile> file1)
{
SaveFiles("c:\test\",file1);
}
protected void SaveFiles(string path, List<IFormFile> files)
{
//一樣要檢查路徑
if (!Directory.Exists(path))
Directory.CreateDirectory(path);
foreach (var file in files)
{
using (var stream = new FileStream(Path.Combine(path, Path.GetFileName(file.FileName)), FileMode.OpenOrCreate))
{
file.CopyTo(stream);
}
}
}
這邊還是提醒一下,Path.GetFileName(file.FileName)是取得檔案名稱含附檔名,如果直接使用file.FileName在Chrome底下會ok,但在IE底下可是會直接取得本機完整路徑(如C:\xxx\xxx.pdf)的,所以後面存取檔案會有問題。
Razor Page範例:
參考資料
https://docs.microsoft.com/zh-tw/aspnet/core/mvc/models/file-uploads?view=aspnetcore-3.1