ASP.NET Core 使用 IFormFile上传单个或多个文件
介绍
在本文中,我们将了解如何在 asp.net core web 应用程序中上传文件并将它们存储在应用程序的根目录中。我们将使用 IFormFile 上传文件,并了解如何使用文件传递其他数据。
在本文中,
- 什么是 IFormFile
- 创建 Asp.Net Core 项目
- 上传单个文件
- 上传多个文件
什么是 IFormFile
ASP.NET Core 引入了一个 IFormFile 接口,它表示 HTTP 请求中传输的文件。该接口使我们能够访问诸如 ContentDisposition、ContentType、Length、FileName 等元数据。IFormFile 还提供了一些用于存储文件的方法。IFormFile 接口还允许我们通过可访问的 Stream 读取文件的内容。
创建 Asp.Net Core 项目
第1步
打开 Visual Studio 并单击创建新项目。
第2步
选择 ASP.Net Core Web App (MVC) 并单击下一步按钮。
第 3 步
在下一个屏幕中,输入以下详细信息,然后单击“下一步”按钮。
- 项目名
- 您要存储项目的位置
第四步
在下一个屏幕中,配置其他详细信息或保留默认设置,然后单击创建按钮。
第 5 步
现在我们的项目已经创建好了。现在我们将为我们的操作创建一个新的控制器。
要添加新控制器,请右键单击控制器文件夹,然后单击添加,然后单击控制器。
从左侧过滤器中选择控制器,然后选择 MVC 控制器 – 空并单击添加按钮。然后输入控制器名称并单击添加按钮。
第 6 步
现在我们必须在 Models 文件夹中创建模型。我们将使用它来将数据从视图传递到控制器。
在这里,我们创建了三个模型,如下所示
ResponseModel
该模型包含三个属性,即 IsResponse、IsSuccess 和 Message。该模型将被其他两个继承,我们将其用作执行某些操作后的响应状态和消息。
public class ReponseModel
{
public string Message { get; set; }
public bool IsSuccess { get; set; }
public bool IsResponse { get; set; }
}
SingleFileModel
我们将使用此模型一次上传一个文件。该模型包含两个属性,FileName,我们将在服务器上存储文件时将其用作文件名。另一个是 IFormFile 类型的 File。这两个属性都具有数据所需的注释属性,用于向用户显示验证。
public class SingleFileModel : ReponseModel
{
[Required(ErrorMessage = "Please enter file name")]
public string FileName { get; set; }
[Required(ErrorMessage = "Please select file")]
public IFormFile File{ get; set; }
}
MultipleFilesModel
我们将使用此模型一次存储多个文件。该模型仅包含一个属性,即 IFormFile 列表类型。
public class MultipleFilesModel : ReponseModel
{
[Required(ErrorMessage = "Please select files")]
public List<IFormFile> Files { get; set; }
}
上传单个文件
第1步
创建单个文件上传的视图。在这里,我为此使用了索引操作方法。从索引中,我们将模型 SingleFileModel 传递给视图,以便在视图端访问其属性。
public IActionResult Index()
{
SingleFileModel model = new SingleFileModel();
return View(model);
}
要添加视图,请右键单击操作方法,然后单击添加视图。
然后从左侧过滤器中选择查看并选择 Razor View – Empty。然后点击添加按钮。
第2步
根据您的要求为您的视图创建设计。在这里,我使用简单的设计,如下面的代码所示。
@model UploadFile.Models.SingleFileModel
@{
ViewData["Title"] = "Single File Upload";
}
<form asp-action="Upload" asp-controller="Upload" method="post" enctype = "multipart/form-data">
@if (Model.IsResponse)
{
if (Model.IsSuccess)
{
<div class="alert alert-success">
@Model.Message
</div>
}
else
{
<div class="alert alert-danger">
@Model.Message
</div>
}
}
<div class="row mt-2">
<div class="col-12">
<label class="col-form-label">Enter File Name For Save</label>
<input asp-for="FileName" class="form-control" />
<span asp-validation-for="FileName" class="text-danger"></span>
</div>
</div>
<div class="row mt-2">
<div class="col-12">
<label class="col-form-label">Select File</label>
<input asp-for="File" class="form-control" />
<span asp-validation-for="File" class="text-danger"></span>
</div>
</div>
<div class="row mt-2">
<div class="col-12">
<button type="submit" class="btn btn-success">Upload File</button>
</div>
</div>
</form>
解释
- 正如您在上面的代码片段中看到的,我创建了一个带有 post 方法的表单并重定向到 Upload 控制器和 Upload Action 方法。
- 这里我们将表单数据(文件)与其他数据一起传递,因此我们在表单标签中添加了 enctype = “multipart/form-data” 属性。
- 我们还添加了提交类型的按钮,将我们的表单提交给给定的操作方法。
- 这里还使用我们的响应模型在引导程序的警报组件中显示成功和错误消息,根据 IsSuccess 属性分别为成功和危险。
第 3 步
创建将文件存储在服务器上的 post 方法。
[HttpPost]
public IActionResult Upload(SingleFileModel model)
{
if (ModelState.IsValid)
{
model.IsResponse = true;
string path = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot/Files");
//create folder if not exist
if (!Directory.Exists(path))
Directory.CreateDirectory(path);
//get file extension
FileInfo fileInfo = new FileInfo(model.File.FileName);
string fileName = model.FileName + fileInfo.Extension;
string fileNameWithPath = Path.Combine(path, fileName);
using (var stream = new FileStream(fileNameWithPath, FileMode.Create))
{
model.File.CopyTo(stream);
}
model.IsSuccess = true;
model.Message = "File upload successfully";
}
return View("Index", model);
}
解释
- 正如您在上面的代码中看到的,我们创建了一个名为 Upload 的 post 方法,它接受 SingleFileModel 作为参数。
- 然后我们使用 ModelState.Valid 属性检查我们的模型是否有效。如果模型有效,则进入下一个操作,否则返回视图并显示验证消息。
- 接下来,我们将创建一个名为 path 的变量,其中包含我们要存储文件的根目录路径。
- 在单个文件上传中,我们使用用户输入的名称存储一个文件,因此在这里我们使用文件信息获取文件扩展名并创建新文件名。
- 然后我们创建一个文件创建流,并使用 IFormFile 的复制方法将传入的文件复制到它,并将成功消息传递给视图。
输出(显示验证)
输出(文件上传后的成功消息)
输出(服务器目录中的文件)
上传多个文件
第1步
在控制器中添加新的操作方法,如下面的代码所示。这里我们在视图中传递 MultipleFilesModel。
public IActionResult MultiFile()
{
MultipleFilesModel model = new MultipleFilesModel();
return View(model);
}
第2步
根据您的要求在您的视图中添加设计。
@model UploadFile.Models.MultipleFilesModel
@{
ViewData["Title"] = "Multi File Upload";
}
<form asp-action="MultiUpload" asp-controller="Upload" method="post" enctype="multipart/form-data">
@if (Model.IsResponse)
{
if (Model.IsSuccess)
{
<div class="alert alert-success">
@Model.Message
</div>
}
else
{
<div class="alert alert-danger">
@Model.Message
</div>
}
}
<div class="row mt-2">
<div class="col-12">
<label class="col-form-label">Select Multiple Files</label>
<input asp-for="Files" class="form-control" multiple/>
<span asp-validation-for="Files" class="text-danger"></span>
</div>
</div>
<div class="row mt-2">
<div class="col-12">
<button type="submit" class="btn btn-success">Upload Files</button>
</div>
</div>
</form>
解释
- 正如您在上面看到的,此视图与单个文件上传视图几乎相同。但是这里我们只使用了一个控件,即文件上传,并在输入标签中添加了多个属性,允许我们选择多个文件。
- 此外,我们将表单发布到具有上传多个文件的逻辑的不同方法。
第 3 步
在控制器端创建后操作方法以一次存储多个文件。
[HttpPost]
public IActionResult MultiUpload(MultipleFilesModel model)
{
if (ModelState.IsValid)
{
model.IsResponse = true;
if (model.Files.Count > 0)
{
foreach (var file in model.Files)
{
string path = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot/Files");
//create folder if not exist
if (!Directory.Exists(path))
Directory.CreateDirectory(path);
string fileNameWithPath = Path.Combine(path, file.FileName);
using (var stream = new FileStream(fileNameWithPath, FileMode.Create))
{
file.CopyTo(stream);
}
}
model.IsSuccess = true;
model.Message = "Files upload successfully";
}
else
{
model.IsSuccess = false;
model.Message = "Please select files";
}
}
return View("MultiFile", model);
}
解释
- 正如您在上面的代码中看到的,我们创建了一个名为 MultiUpload 的 post 方法,它以 MultipleFilesModel 作为参数。
- 首先,我们检查 ModelState 是否有效。
- 然后我们检查 List<IFormFile> 的 files 属性是否有一个或多个文件。
- 然后使用 for 每个循环迭代所有文件。在与单个文件上传代码相同的循环中,我们存储文件,但在这里我们使用文件本身的名称作为文件名而不是用户输入。
- 在此之后,在我们的响应模型属性中返回成功消息并返回到 MultiFile 视图。
- 最后,我还在布局文件中为这两个视图添加了一个菜单。在这两个视图之间轻松导航。你可以按照你的要求去做。
输出(显示验证)
输出(选择文件)
输出(服务器目录中的文件)
结论
而已。这就是我们使用 IFormFile 在 asp.net core服务器上上传和存储单个或多个文件的方式。我希望你觉得这很有用并得到一些帮助。谢谢。
您可以从我的GitHub访问源代码 。
常见问题FAQ
- 程序仅供学习研究,请勿用于非法用途,不得违反国家法律,否则后果自负,一切法律责任与本站无关。
- 请仔细阅读以上条款再购买,拍下即代表同意条款并遵守约定,谢谢大家支持理解!