ASP.NET Core 一行代码搞定文件上传
在现代Web开发中,文件上传是一个常见且重要的功能。无论是用户上传个人头像、文件分享,还是其他用途,良好的文件上传机制都能极大地提升用户体验。虽然文件上传的过程看似简单,但在实际开发中,涉及到的安全性、性能和用户友好性等问题都需要特别关注。本文将探讨如何在ASP.NET Core中以一行代码实现文件上传功能,并附带示例和深入的分析。
一、ASP.NET Core简介
ASP.NET Core是一个高性能、开源的跨平台框架,旨在构建现代的、云端的Web应用程序。它的模块化设计允许开发者使用NuGet包轻松扩展功能,同时支持多种类型的应用程序,如Web应用、Web API、微服务等。
二、项目准备
在开始之前,我们需要确保环境中已安装以下组件:
- .NET SDK(建议使用最新版本)
 - 适合的IDE(如Visual Studio、Visual Studio Code)
 
创建项目
使用命令行创建一个新的ASP.NET Core Web应用程序:
dotnet new webapp -n FileUploadDemo
进入项目目录:
cd FileUploadDemo
三、实现文件上传
在ASP.NET Core中,实现文件上传的步骤相对简单。我们将使用IFormFile接口,它表示上传的文件。接下来,我们将一步步实现文件上传的功能。
1. 创建上传视图
在Pages文件夹中,创建一个新的Razor页面,命名为Upload.cshtml。在这个页面中,我们将添加一个简单的HTML表单来选择文件并进行上传。
@page
@model UploadModel
@{
    ViewData["Title"] = "文件上传";
}
<h2>文件上传</h2>
<form method="post" enctype="multipart/form-data">
    <div>
        <label for="file">选择文件:</label>
        <input type="file" id="file" name="file" />
    </div>
    <div>
        <button type="submit">上传</button>
    </div>
</form>
@if (Model.UploadedFileName != null)
{
    <p>文件上传成功:@Model.UploadedFileName</p>
}
2. 创建模型
在Pages文件夹中,创建一个名为Upload.cshtml.cs的C#文件,定义文件上传的逻辑。
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
public class UploadModel : PageModel
{
    [BindProperty]
    public IFormFile File { get; set; }
    public string UploadedFileName { get; private set; }
    public void OnPost()
    {
        if (File != null && File.Length > 0)
        {
            var filePath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot/uploads", File.FileName);
            using (var stream = new FileStream(filePath, FileMode.Create))
            {
                File.CopyTo(stream);
            }
            UploadedFileName = File.FileName;
        }
    }
}
在上面的代码中,我们通过[BindProperty]将上传的文件绑定到File属性。当表单提交时,OnPost方法会被调用,如果文件有效,就会将其保存到wwwroot/uploads目录中。
3. 配置Startup.cs
为了使文件上传工作正常,我们需要确保在Startup.cs中配置了静态文件服务。
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Error");
        app.UseHsts();
    }
    app.UseHttpsRedirection();
    app.UseStaticFiles();
    app.UseRouting();
    app.UseAuthorization();
    app.UseEndpoints(endpoints =>
    {
        endpoints.MapRazorPages();
    });
}
四、简单的一行代码
在ASP.NET Core中,实现文件上传的核心逻辑其实可以浓缩成一行代码。在OnPost方法中,我们可以直接使用LINQ表达式处理文件上传。下面是一个将上传文件保存到指定目录的简化版本:
public void OnPost() => UploadedFileName = File != null && File.Length > 0 ? (File.CopyTo(new FileStream(Path.Combine(Directory.GetCurrentDirectory(), "wwwroot/uploads", File.FileName), FileMode.Create), null), File.FileName) : null;
这行代码实现了文件上传的完整逻辑,尽管这种写法在可读性上有所欠缺,但却展示了ASP.NET Core的强大能力。
五、安全性考虑
文件上传功能涉及安全性问题。在生产环境中,我们应该确保:
- 文件类型限制:检查文件扩展名,避免用户上传可执行文件或其他危险文件。
 - 文件大小限制:可以在
Startup.cs中设置文件大小限制。 
services.Configure<FormOptions>(options =>
{
    options.MultipartBodyLengthLimit = 10485760; // 10 MB
});
- 文件保存路径:确保上传的文件路径不在可执行目录中,以防止恶意代码执行。
 
- 点赞
 - 收藏
 - 关注作者
 
            
           
评论(0)