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

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实现方法与代码示例
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。

相关推荐

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

同类最新

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

更多
PyTorch中使用多维索引张量对高维张量批量索引的正确方法
编程语言 · 2026-07-03

PyTorch中使用多维索引张量对高维张量批量索引的正确方法

本文深入讲解如何在 PyTorch 中利用形状为 [b, k] 的索引张量 B,对形状为 [b, m, n] 的高维张量 A 执行高效批量索引,最终得到 [b, k, n] 的输出。核心思路在于合理扩展索引维度并配合 torch gather 实现精准的逐行抽取。 很多人处理高维张量的批量索引时都会

Go中...操作符解包切片传递可变参数函数
编程语言 · 2026-07-03

Go中...操作符解包切片传递可变参数函数

在 Go 语言中,` ` 运算符放在切片变量后面(如 `slice `)的作用是将该切片“展开”为多个独立参数,专门用于调用那些接受可变参数(` T`)的函数,例如 `append` 或 `fmt Println`。这是一种类型安全的语法糖,并非省略号或通配符,能够帮助开发者更简洁地处理

macOS与WSL2下PHP多版本切换失效问题排查与修复指南
编程语言 · 2026-07-03

macOS与WSL2下PHP多版本切换失效问题排查与修复指南

本文深入分析在 macOS 或 WSL2(Ubuntu)开发环境中,通过 Homebrew 管理 PHP 多版本时,php -v 始终显示旧版本(如 php@5 6)的深层原因,并给出系统性解决方案,覆盖 PATH 冲突、符号链接逻辑、Shell 初始化配置、系统残留配置等关键环节。 遇到这种情况的

PHP JSON解析深层嵌套对象属性访问失败的解决方法
编程语言 · 2026-07-03

PHP JSON解析深层嵌套对象属性访问失败的解决方法

使用 json_decode() 解析 API 返回的 JSON 数据时,经常遇到某个子属性无法正常获取,始终返回 NULL —— 这是许多 PHP 开发者都曾碰到过的棘手问题。通常并非数据丢失,而是对象嵌套层级比预期更深,导致访问路径不正确。 举例来说,你看到返回的 JSON 里有一个 appea

nnU-Net v2预处理卡死问题的成因分析与实用解决指南
编程语言 · 2026-07-03

nnU-Net v2预处理卡死问题的成因分析与实用解决指南

> 使用 nnUNetv2_plan_and_preprocess 处理大规模数据集(例如 704 例样本)时,程序常因多进程加载导致死锁而停滞。核心原因在于默认并发数过高引发资源竞争或 I O 阻塞,适当降低并发数即可稳定完成全量预处理。 你在使用 `nnunetv2_plan_and_prepr