ASP.Net Core MVC支持通过利用IFormFile接口的模型绑定来上传文件。 回想一下,模型绑定将数据从HTTP请求映射到操作方法参数。 模型绑定简化了对HTTP请求发送的数据的访问,并使操作方法更易于进行单元测试。 IFormFile接口仅表示通过HTTP请求发送的文件。
我们可以利用ASP.Net Core MVC应用程序中的IFormFile接口来表示一个文件,该文件与HTTP请求一起从客户端发送到服务器。 本文讨论了如何在ASP.Net Core MVC中上传文件。
创建一个ASP.Net Core MVC项目
首先,让我们在Visual Studio中创建一个ASP.Net Core MVC项目。 在撰写本文时,可以免费下载Visual Studio 2019。 如果您的系统中没有安装Visual Studio 2019的副本,则可以在此处下载它 。
接下来,按照下面给出的步骤在Visual Studio中创建一个新的ASP.Net Core项目。
- 启动Visual Studio IDE。
- 点击“创建新项目”。
- 在“创建新项目”窗口中,从显示的模板列表中选择“ ASP.Net Core Web应用程序”。
- 点击下一步。
- 在“配置新项目”窗口中,指定新项目的名称和位置。
- 单击创建。
- 接下来显示一个新窗口,“创建新的ASP.Net Core Web应用程序”。
- 选择.Net Core作为运行时,并从顶部的下拉列表中选择ASP.Net Core 2.2(或更高版本)。
- 选择“ Web应用程序(模型-视图-控制器)”作为项目模板。
- 确保未选中“启用Docker支持”和“配置HTTPS”复选框,因为我们此处将不使用这些功能。
- 确保将身份验证设置为“无身份验证”,因为我们也不会使用身份验证。
- 单击创建。
这将在Visual Studio 2019中创建一个新的ASP.Net Core MVC项目。现在我们准备开始编码。
在ASP.Net Core MVC中上传单个文件
在本节中,我们将研究如何利用Microsoft.AspNetCore.Http命名空间中的IFormFile接口来上传一个或多个文件。 这是IFormFile接口的外观。
public interface IFormFile
{
string ContentType { get; }
string ContentDisposition { get; }
IHeaderDictionary Headers { get; }
long Length { get; }
string Name { get; }
string FileName { get; }
Stream OpenReadStream();
void CopyTo(Stream target);
Task CopyToAsync(Stream target, CancellationToken
cancellationToken = null);
}
在新创建的项目的“解决方案资源管理器”窗口中,创建一个名为FileUploadController的新控制器,并编写以下操作方法来上载文件。
[HttpPost("UploadFile")]
public async Task<IActionResult> UploadFile
(IFormFile iFormFile)
{
if (iFormFile == null || iFormFile.Length == 0)
return ContentResult("No file selected for upload.");
var filePath = Path.GetTempFileName();
using (var stream = new FileStream(filePath,
FileMode.Create))
{
await iFormFile.CopyToAsync(stream);
}
return RedirectToAction("Home");
}
action方法接受对IFormFile的引用作为参数。 它检查此引用是否为null或文件的长度为零。 无论哪种情况,处理都将被忽略,并且该方法将返回带有文本消息“未选择要上传的文件”的ContentResult。 否则,GetTempFileName方法将返回一个临时文件名。
接下来,使用FileStream对象创建文件,并在IFormFile实例上调用CopyToAsync方法,以将上传的文件的内容异步复制到目标流。
在ASP.Net Core MVC中上传多个文件
当您尝试上载单个文件时,您的操作方法可以包括IFormFile引用作为参数。 如果要上传多个文件,则应使用IEnumerable <IFormFile>或List <IFormFile>作为代表几个文件的参数。
在下面的示例中,UploadFiles操作方法接受IFormFile的常规列表作为参数。
[HttpPost("UploadFiles")]
public async Task<IActionResult> UploadFiles(List<IFormFile> iFormFiles)
{
var filePath = Path.GetTempFileName();
foreach (var iFormFile in iFormFiles)
{
if (iFormFile.Length > 0)
{
using (var stream = new FileStream(filePath,
FileMode.Create))
{
await iFormFile.CopyToAsync(stream);
}
}
}
return RedirectToAction("Home");
}
请注意,此处的操作方法使用GetTempFileName方法,如果临时文件的数量超过65535,则会引发异常。因此,如果要上传的文件超过65535,则应在处理后删除临时文件,或使用使用GetTempPath和GetRandomFileName方法创建临时文件名。
使用ASP.Net Core MVC下载文件
要下载文件,可以使用以下代码。
public async Task<IActionResult> DownloadFile
(string path, string filename)
{
if (filename == null || filename.Length == 0)
return Content
("No file selected for download.");
var filePath = Path.Combine(path, filename);
var memoryStream = new MemoryStream();
using (var stream = new FileStream
(filePath, FileMode.Open))
{
await stream.CopyToAsync(memoryStream);
}
memoryStream.Position = 0;
return File(memoryStream, "text/plain",
Path.GetFileName(path));
}
DownloadFile方法使用CopyToAsync方法将文件的内容复制到内存流对象。 然后,它通过指定要下载的文件的适当内容类型来返回FileStreamResult的实例。 在此示例中,为简单起见,我们已将内容类型硬编码为“文本/纯文本”。
在ASP.Net Core MVC中创建Razor视图
现在,让我们创建一个HTML视图以上传一个或多个文件。 在“解决方案资源管理器”窗口中选择“视图”解决方案文件夹,创建一个新的Razor视图页面,然后向其中添加以下代码。
<form asp-controller="FileUpload" asp-action="UploadFile" method="post"
enctype="multipart/form-data">
<input type="file" name="file" />
<button type="submit">Upload File</button>
</form>
<form asp-controller="FileUpload" asp-action="UploadFiles" method="post"
enctype="multipart/form-data">
<input type="file" name="files" multiple />
<button type="submit">Upload Files</button>
</form>
请注意,您HTML表单应将编码类型设置为“ multipart / form-data”。 还应该有一个或多个输入元素,其类型属性设置为“文件”并指向操作方法。 如果有多个文件要上载,则输入元素应设置多个属性。 enctype属性用于指定在将请求从客户端发送到服务器时如何对表单数据进行编码。
ASP.Net Core MVC为模型绑定提供了出色的支持,可以利用它上载一个或多个大小较小的文件。 我们将在后面的文章中更详细地探讨ASP.Net Core中的文件上传和下载。
翻译自: https://www.infoworld.com/article/3390218/how-to-upload-files-in-aspnet-core-mvc.html