ASP.Net Core创建Razor页面上传单个文件(缓冲方式)

  微软最新的.net 6文档中专门有一章节介绍文件上传相关的知识(参考文献1),同时配套有示例代码和项目,示例项目中包含的内容很多,有缓冲方式上传、流式上传、单个文件上传、多个文件上传、Razor页面上传、上传到数据库、上传到物理文件夹、带过滤器的上传等,内容太多,学起来也不方便。准备从微软示例项目中逐步剥代码,学到哪里就剥到哪里,本文先从最简单的Razor页面上传单个文件到物理文件夹开始学习。
  运行下列名称创建webapp项目

dotnet new webapp -o UploadFileByRazorPage
code -r UploadFileByRazorPage

  项目创建后,不需要改动Program.cs中的代码,只用在appsettings.json文件中增加一个物理文件保存地址的配置项即可。

"StoredFilesPath": "/home/XXX/文档/MyPrograms/FileBuffer"

  关于缓冲和流式的区别,参考文献1中介绍的比较清楚,本文不在赘述。缓冲方式上传文件主要使用IFormFile接口处理或保存文件,本文中使用FileName属性获取上传文件的名称,使用CopyToAsync函数获取并保存文件内容。
在这里插入图片描述

  直接将项目默认创建的Index.cshtml和Index.cshtml.cs参照微软示例修改为文件上传页面。定义FileUpload属性用于保存缓冲文件(该属性类型定义中包含IFormFile属性),同时将FileUpload属性绑定到页面表单中。初次之外最重要的函数就是OnPostUploadAsync,该函数接收表单的post请求,并将文件保存到本地文件夹中。微软示例中提供有专门的FileHelpers类用于文件检查及处理,本文精简其代码,并嵌入到OnPostUploadAsync函数中,函数实现代码如下所示:

 public BufferedSingleFileUploadPhysical? FileUpload { get; set; }
 
 public async Task<IActionResult> OnPostUploadAsync()
        {
            if (!ModelState.IsValid)
            {
                Result = "Please correct the form.";

                return Page();
            }

            byte[] formFileContent=null;

            try
            {
                using (var memoryStream = new MemoryStream())
                {
                    await FileUpload.FormFile.CopyToAsync(memoryStream);

                    if (memoryStream.Length == 0)
                    {
                        ModelState.AddModelError(FileUpload.FormFile.FileName,"file is empty.");
                    }

                    formFileContent=memoryStream.ToArray();
                }
            }
            catch (Exception ex)
            {
                ModelState.AddModelError(FileUpload.FormFile.FileName,
                    "file upload failed. " + $"Please contact the Help Desk for support. Error: {ex.HResult}");                                        
            }


            if (!ModelState.IsValid)
            {
                Result = "Please correct the form.";

                return Page();
            }
            
             var filePath = Path.Combine(
                _targetFilePath, FileUpload.FormFile.FileName);

            using (var fileStream = System.IO.File.Create(filePath))
            {
                await fileStream.WriteAsync(formFileContent);
            }

            Result = "File Upload Successfully.";

            return Page();
        }

  接着是Index.cshtml页面,页面中的表单仅包含文件上传标签,需要特别说明的是表单的enctype要指定为"multipart/form-data"才行,其它没有什么特别的。

<form enctype="multipart/form-data" method="post">
    <dl>
        <dt>
            <label asp-for="FileUpload.FormFile"></label>
        </dt>
        <dd>
            <input asp-for="FileUpload.FormFile" type="file" />
            <span asp-validation-for="FileUpload.FormFile"></span>
        </dd>
    </dl>
    <input asp-page-handler="Upload" class="btn" type="submit" value="上传文件" />
</form>

  最后的程序执行效果,从下面图形可以看到,可以将选定的文件上传到指定物理文件夹中。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

参考文献
[1]https://docs.microsoft.com/zh-cn/aspnet/core/mvc/models/file-uploads?view=aspnetcore-6.0
[2]https://docs.microsoft.com/zh-CN/dotnet/api/microsoft.aspnetcore.http.iformfile?view=aspnetcore-6.0

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ASP.NET Core Razor编程中,列表模板页面是非常常见的。这些页面通常用于显示数据库或其他数据源中的一组记录。 在本文中,我将向您展示如何使用ASP.NET Core Razor列表模板页面。 首先,我们需要创建一个模型类来代表我们的数据。例如,假设我们正在构建一个博客应用程序,我们需要一个名为“Post”的模型类来表示博客文章。以下是一个示例模型类: ```csharp public class Post { public int Id { get; set; } public string Title { get; set; } public string Content { get; set; } public DateTime CreatedDate { get; set; } } ``` 接下来,我们需要创建一个控制器类来处理与“Post”模型类相关的操作。以下是一个示例控制器类: ```csharp public class PostController : Controller { private readonly ApplicationDbContext _context; public PostController(ApplicationDbContext context) { _context = context; } public IActionResult Index() { var posts = _context.Posts.ToList(); return View(posts); } } ``` 在此示例控制器中,我们从数据库中检索所有博客文章,并将它们传递给视图。 现在,我们需要创建一个视图来显示我们的博客文章列表。我们可以使用ASP.NET Core Razor模板引擎来创建一个动态模板,该模板可以将我们的博客文章显示为HTML表格。以下是一个示例视图: ```html @model IEnumerable<Post> <table> <thead> <tr> <th>Title</th> <th>Content</th> <th>Created Date</th> </tr> </thead> <tbody> @foreach (var post in Model) { <tr> <td>@post.Title</td> <td>@post.Content</td> <td>@post.CreatedDate.ToShortDateString()</td> </tr> } </tbody> </table> ``` 在此示例视图中,我们使用了一个foreach循环遍历我们的博客文章,并将它们显示为HTML表格行。 最后,我们需要在控制器的Index方法中返回视图。在我们的示例控制器中,我们已经传递了一个包含所有博客文章的IEnumerable<Post>对象。我们可以将此对象传递给视图,如下所示: ```csharp public IActionResult Index() { var posts = _context.Posts.ToList(); return View(posts); } ``` 现在,当我们访问PostController的Index操作时,我们将看到一个包含所有博客文章的HTML表格。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值