ASP.NET Core 6 Web API中Swagger POST方法如何显示文件上传按钮
解决方法
出现这个问题的核心原因是默认的Swagger生成器不会自动为IFormFile类型的表单参数映射文件上传控件,需要通过自定义操作过滤器显式声明参数的文件类型属性,配置步骤如下:
第一步:添加文件上传操作过滤器
在项目中新建如下过滤器类,用于扫描接口中的文件参数,生成符合OpenAPI规范的文件上传描述:
using Microsoft.OpenApi.Models; using Swashbuckle.AspNetCore.SwaggerGen; public class FileUploadOperationFilter : IOperationFilter { public void Apply(OpenApiOperation operation, OperationFilterContext context) { // 检测当前接口是否包含IFormFile类型参数 bool isFileUploadApi = context.ApiDescription.ActionDescriptor.Parameters .Any(p => p.ParameterType == typeof(IFormFile) || p.ParameterType == typeof(IFormFileCollection)); if (!isFileUploadApi) { return; } // 定义multipart/form-data类型的请求体 operation.RequestBody = new OpenApiRequestBody { Content = new Dictionary<string, OpenApiMediaType> { ["multipart/form-data"] = new OpenApiMediaType { Schema = new OpenApiSchema { Type = "object", Properties = new Dictionary<string, OpenApiSchema> { // 这里的键名必须和接口中定义的IFormFile参数名一致,示例中参数名为file ["file"] = new OpenApiSchema { Type = "string", Format = "binary" } }, // 如果文件是必传参数,保留下面这行,否则可删除 Required = new HashSet<string> { "file" } } } } }; } }
第二步:在Swagger配置中注册过滤器
打开Program.cs,找到之前写的AddSwaggerGen配置块,添加过滤器注册代码:
builder.Services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "Web API", Version = "v1" }); var baseDirectory = AppDomain.CurrentDomain.BaseDirectory; var commentsFileName = Assembly.GetEntryAssembly().GetName().Name + ".xml"; var commentsFile = Path.Combine(baseDirectory, commentsFileName); c.IncludeXmlComments(commentsFile); // 注册自定义文件上传过滤器 c.OperationFilter<FileUploadOperationFilter>(); });
第三步:重启项目验证效果
重新运行应用进入Swagger UI,打开upload接口的调试面板,就能看到文件选择按钮,点击即可选择本地文件上传。
如果接口需要支持多文件上传,只需要把接口参数类型改为
IFormFileCollection或者List<IFormFile>,同时在过滤器的Properties中对应调整参数配置即可。
内容的提问来源于stack exchange,提问作者Bhav
相关产品推荐
相关产品推荐

