LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

【C#.net】如何使用 Web API 轻松实现文件上传功能

admin
2025年1月20日 17:23 本文热度 130

前言

在Web应用程序开发过程中,将文件上传到服务器上是一种常见的需求,在很多场景中都非常有用,比如用户头像、图片等资源上传到服务器后进行存储或进一步处理。本文将介绍如何使用.NET Web API 实现文件上传。

实现过程

1、使用 Visual Studio 2022 创建项目 ASP.NET Core Web API 项目

2、配置服务和中间件

添加必要的服务和中间件来处理文件上传,如果上传文件存储目录不是默认的 wwwroot 目录,则可以使用 UseStaticFilesr 中间件服务重载方法。使用app.UseStaticFiles配置静态文件中间件以达到创建虚拟路径。如下面代码段:

using Microsoft.AspNetCore.Http.Features;using Microsoft.Extensions.FileProviders;namespace Fountain.WebAPI.UploadDemo{    public class Program    {        public static void Main(string[] args)        {            var builder = WebApplication.CreateBuilder(args);            builder.Services.AddControllers();                        builder.Services.AddEndpointsApiExplorer();            builder.Services.AddSwaggerGen();            builder.Services.Configure<FormOptions>(options =>            {                options.ValueLengthLimit = int.MaxValue;                // 设置允许接收非常大的请求体长度                options.MemoryBufferThreshold = 1;                // 设置单个文件大小限制为2MB                options.MultipartBodyLengthLimit = 2097152;            });            var app = builder.Build();            if (app.Environment.IsDevelopment())            {                app.UseSwagger();                app.UseSwaggerUI();            }            app.UseHttpsRedirection();            app.UseAuthorization();            string uploadPath = (app.Environment.ContentRootPath + "/Upload").Replace("/", "\\");             if (!Directory.Exists(uploadPath))            {                Directory.CreateDirectory(uploadPath);            }            // 使用自定义的静态文件目录            app.UseStaticFiles(new StaticFileOptions            {                FileProvider = new PhysicalFileProvider(                    Path.Combine(app.Environment.ContentRootPath, "upload")                ),                RequestPath = "/upload"            });            app.MapControllers();            app.Run();        }    }}

3、创建控制器

在项目的 Controllers 文件夹中,创建文件上传的控制器类。如下面代码:

using Microsoft.AspNetCore.Http;using Microsoft.AspNetCore.Mvc;using Microsoft.Extensions.Logging;namespace Fountain.WebAPI.UploadDemo.Controllers{    [Route("api/[controller]")]    [ApiController]    public class UploadFileController : ControllerBase    {        public static IWebHostEnvironment webHostEnvironment;        /// <summary>        ///         /// </summary>        /// <param name="environment"></param>        public UploadFileController(IWebHostEnvironment environment)        {            webHostEnvironment = environment;        }        /// <summary>        ///         /// </summary>        /// <param name="file"></param>        /// <returns></returns>        [HttpPost]        public async Task<IActionResult> Upload(IFormFile file)        {            ResponseContent response = new ResponseContent();            try            {                // 在服务器端,应该验证上传文件的类型,防止恶意文件(如可执行文件)的上传。                // 可以通过检查文件的扩展名或者内容类型(ContentType属性)来进行验证                var allowedExtensions = new[] { ".jpg"".png"};                var fileExtension = Path.GetExtension(file.FileName);                if (!allowedExtensions.Contains(fileExtension))                {                    response.Success = false;                    response.Message = "不允许的文件类型";                    return StatusCode(500, response);                }                if (file == null || file.Length == 0)                {                    response.Success = false;                    response.Message = "没有文件上传";                    return StatusCode(500, response);                }                // 文件大小限制,限制为2MB                if (file.Length > 2 * 1024 * 1024)                 {                    response.Success = false;                    response.Message = "文件太大";                    return StatusCode(500, response);                }                // 设置上传文件存放路径                string webPath =string.Format("{0}{1}{2}{3}",webHostEnvironment.ContentRootPath,Path.DirectorySeparatorChar,"Upload", Path.DirectorySeparatorChar);                if (!Directory.Exists(webPath))                {                    Directory.CreateDirectory(webPath);                }                //                 using (FileStream filestream = System.IO.File.Create(webPath  + file.FileName))                {                    file.CopyTo(filestream);                    filestream.Flush();                }            }            catch (Exception exception)            {                response.Success = false;                response.Message = "文件上传失败";                return StatusCode(500, response);            }            response.Success = false;            response.Message = "上传成功";            return Ok(response);        }    }}
定义响应实现
namespace Fountain.WebAPI.UploadDemo{    public class ResponseContent    {        /// <summary>        /// 状态        /// </summary>        public bool Success { get; set; }        /// <summary>        /// 消息        /// </summary>        public string Message { get; set; }        /// <summary>        /// 保存响应数据        /// </summary>        public object Data { get; set; }    }}

4、优化与改进

 文件大小限制

默认情况下,ASP.NET Core 对上传文件的大小设有一定限制。若需突破这一限制,可在 Program.cs 文件中进行配置。

builder.Services.Configure<FormOptions>(options =>{    options.ValueLengthLimit = int.MaxValue;    // 设置允许接收非常大的请求体长度    options.MemoryBufferThreshold = 1;    // 设置单个文件大小限制为2MB    options.MultipartBodyLengthLimit = 2097152;});

可以通过在上传方法中嵌文件大小验证逻辑,限制文件大小的上传。

// 文件大小限制 限制为2MBif (file.Length > 2 * 1024 * 1024) {    response.Success = false;    response.Message = "文件太大";    return StatusCode(500, response);}

文件类型验证

文件上传,需确保文件为我们需要的类型(如图片类型),可以通过在上传方法中嵌文件类型的验证逻辑。

// 在服务器端,应该验证上传文件的类型,防止恶意文件(如可执行文件)的上传。// 可以通过检查文件的扩展名或者内容类型(ContentType属性)来进行验证var allowedExtensions = new[] { ".jpg"".png" };var fileExtension = Path.GetExtension(file.FileName);if (!allowedExtensions.Contains(fileExtension)){    response.Success = false;    response.Message = "不允许的文件类型";    return StatusCode(500, response);}

小结

通过上述一系列步骤,我们就可在 Web API 中实现文件的上传功能。在实际应用场景中,我们还需根据业务需求进一步拓展完善该功能。


该文章在 2025/1/22 10:21:10 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2025 ClickSun All Rights Reserved