游乐游手机版
首页/编程语言/文章详情

ASP.NETCore实现高效文件上传完整示例教程

时间:2026-05-07 13:14
在现代Web应用中,文件上传功能常常是必不可少的 如果你正在使用ASP NET Core,可能会发现处理文件上传不仅相对简单,还提供了相当灵活的配置空间。这篇文章将带你一步步摸清门道,从最基本的文件上传操作,到如何有效限制文件大小和验证文件类型,这些实用的技巧一个都不会少。 1 创建 ASP NE

在现代Web应用中,文件上传功能常常是必不可少的

如果你正在使用ASP.NET Core,可能会发现处理文件上传不仅相对简单,还提供了相当灵活的配置空间。这篇文章将带你一步步摸清门道,从最基本的文件上传操作,到如何有效限制文件大小和验证文件类型,这些实用的技巧一个都不会少。

1. 创建 ASP.NET Core 项目

动手之前,先确保你的机器上已经安装了.NET SDK。如果还没有,直接去官方文档下载安装就好,非常简单。

接下来,通过一行命令来创建我们的新项目:

dotnet new webapi -n FileUploadExample
cd FileUploadExample

运行这条命令后,一个基于Web API的项目结构就搭建好了,我们就在这个项目中实现文件上传的核心功能。

2. 配置文件上传

2.1 配置 Startup.cs (实为 Program.cs)

这里有个细节需要注意:如果你使用的是ASP.NET Core 3.0或更高版本,项目配置的主战场已经转移到了Program.cs文件,而不是传统的Startup.cs

首先,打开Program.cs文件,确保添加了下面这段配置,它负责控制文件上传的大小限制:

var builder = WebApplication.CreateBuilder(args);

// 配置文件上传大小限制
builder.Services.Configure(options =>
{
    options.MultipartBodyLengthLimit = 10 * 1024 * 1024; // 设置文件上传大小限制为 10MB
});

var app = builder.Build();

// 配置 HTTP 请求管道
app.UseHttpsRedirection();
app.MapControllers();
app.Run();

2.2 创建文件上传控制器

接下来,在Controllers目录下新建一个控制器FileUploadController.cs,文件上传的业务逻辑就靠它来承载了。

using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using System.IO;
using System.Threading.Tasks;

namespace FileUploadExample.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class FileUploadController : ControllerBase
    {
        // 上传文件的 API
        [HttpPost("upload")]
        public async Task UploadFile(IFormFile file)
        {
            if (file == null || file.Length == 0)
            {
                return BadRequest("未选择文件");
            }

            // 限制文件类型(例如只允许上传 .jpg 和 .png 文件)
            var allowedExtensions = new[] { ".jpg", ".jpeg", ".png" };
            var extension = Path.GetExtension(file.FileName).ToLowerInvariant();
            if (!allowedExtensions.Contains(extension))
            {
                return BadRequest("只允许上传 JPG 和 PNG 格式的文件");
            }

            // 限制文件大小(例如文件大小不能超过 5MB)
            if (file.Length > 5 * 1024 * 1024)
            {
                return BadRequest("文件大小不能超过 5MB");
            }

            // 保存文件到服务器指定路径
            var filePath = Path.Combine(Directory.GetCurrentDirectory(), "UploadedFiles", file.FileName);
            // 确保目标目录存在
            Directory.CreateDirectory(Path.GetDirectoryName(filePath));

            // 保存文件
            using (var stream = new FileStream(filePath, FileMode.Create))
            {
                await file.CopyToAsync(stream);
            }

            return Ok(new { FilePath = filePath });
        }
    }
}

代码解析:

  • 文件大小限制:通过检查 file.Length 来判断文件的大小是否超过指定的最大限制。我们设定文件大小限制为 5MB。
  • 文件类型验证:通过文件的扩展名判断文件类型,只允许上传 .jpg, .jpeg, 和 .png 格式的图片文件。
  • 保存文件:将文件保存在服务器本地,文件保存在 UploadedFiles 文件夹中。你可以根据需求修改保存路径。
  • 返回响应:上传成功后,返回文件的存储路径。

2.3 测试上传接口

实现之后,当然要跑起来看看效果。在命令行里运行:

dotnet run

项目启动后,打开Postman或其他你顺手的API测试工具,发送一个POST请求到以下地址:

https://localhost:5000/api/fileupload/upload

记得在请求中,将一个文件作为file参数附加上去。如果一切顺利,你会收到类似这样的响应,告诉你文件存到哪里去了:

{
    "filePath": "D:\\netcore\\example.jpg"
}

3. 处理多文件上传

单个文件上传是基础,但实际场景中,一次上传多个文件的需求也很常见。好消息是,ASP.NET Core对多文件上传的支持同样十分便捷。

3.1 修改 FileUploadController 以支持多文件上传

[HttpPost("upload-multiple")]
public async Task UploadMultipleFiles(IFormFile[] files)
{
    if (files == null || files.Length == 0)
    {
        return BadRequest("未选择任何文件");
    }

    foreach (var file in files)
    {
        // 限制文件类型
        var allowedExtensions = new[] { ".jpg", ".jpeg", ".png" };
        var extension = Path.GetExtension(file.FileName).ToLowerInvariant();
        if (!allowedExtensions.Contains(extension))
        {
            return BadRequest("只允许上传 JPG 和 PNG 格式的文件");
        }

        // 限制文件大小
        if (file.Length > 5 * 1024 * 1024)
        {
            return BadRequest("文件大小不能超过 5MB");
        }

        // 保存文件
        var filePath = Path.Combine(Directory.GetCurrentDirectory(), "UploadedFiles", file.FileName);
        Directory.CreateDirectory(Path.GetDirectoryName(filePath));
        using (var stream = new FileStream(filePath, FileMode.Create))
        {
            await file.CopyToAsync(stream);
        }
    }

    return Ok(new { Message = "文件上传成功" });
}

代码解析:

  • 多文件上传:通过 IFormFile[] files 接收多个文件。
  • 每个文件都会进行相同的类型验证和大小限制。
  • 所有文件都将保存到 UploadedFiles 文件夹中。

4. 前端实现

后端准备好了,前端也得跟上。这里给出一个极简的HTML表单示例,允许用户选择并上传多个文件:




    
    
    文件上传


    

上传文件

代码解析:

  • FormDataFormData 对象允许你轻松地将表单数据(包括文件)发送到服务器。
  • 使用 fetch 发送文件数据到 upload-multiple API。

5. 小结

可以看到,在ASP.NET Core中,无论是单文件还是多文件上传,从配置、验证到保存,整个流程都相当清晰。关键在于配置好请求限制,并在控制器中对文件类型和大小做好严格的校验。把这些点都掌握好,实现一个健壮的文件上传功能就不是什么难事了。

来源:https://www.jb51.net/aspnet/342615frq.htm
上一篇NET深拷贝实现方法与详细步骤解析 下一篇NETCore消息队列RabbitMQ实现方法与代码示例
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。

相关推荐

补充同频道和同主题内容,方便继续浏览更多相关内容。

同类最新

继续查看同栏目最近更新的文章。

更多
CentOS与Golang打包常见兼容性问题探讨
编程语言 · 2026-07-01

CentOS与Golang打包常见兼容性问题探讨

CentOS与Golang打包的兼容性问题集中在glibc版本不匹配、交叉编译环境变量错误、依赖库缺失及Go依赖管理不规范。可通过Docker容器编译、选择兼容Go版本、正确设置GOOS GOARCH环境变量、安装对应开发包及使用GoModules解决。

CentOS中Fortran与Python如何协同工作从入门到实战完整教程
编程语言 · 2026-07-01

CentOS中Fortran与Python如何协同工作从入门到实战完整教程

在CentOS中,Fortran与Python可通过f2py、SWIG、共享库调用或subprocess协同。f2py封装Fortran为Python模块,支持数组运算;共享库需手动对齐数据类型;系统调用适合独立计算。

CentOS中Golang打包优化方法
编程语言 · 2026-07-01

CentOS中Golang打包优化方法

在CentOS中优化Golang编译打包,可显著提升编译速度并减小二进制文件体积。关键技巧包括:设置环境变量、使用Go模块管理依赖、编译时添加-ldflags= "-s-w "去除调试信息、利用UPX工具压缩、运行strip清理符号表,以及优化cgo内C代码的编译选项。综合运用这些方法能有效优化最终程序。

在CentOS系统中cpustat与其他工具协同使用的完整方法
编程语言 · 2026-07-01

在CentOS系统中cpustat与其他工具协同使用的完整方法

cpustat作为sysstat包的CPU监控工具,可通过管道与grep等命令配合过滤数据,利用脚本自动记录带时间戳的日志,或结合图形工具查看,也可格式化输出后接入Zabbix、Grafana等Web监控系统,实现可视化与告警。

CentOS中readdir与其他Linux发行版的差异
编程语言 · 2026-07-01

CentOS中readdir与其他Linux发行版的差异

CentOS基于RHEL,与Ubuntu、Debian、Fedora在包管理器(yum dnfvsapt)、默认文件系统(XFSvsext4)等存在差异,但readdir等系统调用遵循POSIX标准,行为一致。