介绍

实现这个功能主要还是依赖过滤器

在Swagger中利用 IOperationFilter 操作来实现文件上传

与之前处理结合Idr4授权一样的处理方式,不同的是授权处理的是Security,而文件上传要处理的是Parameters,具体是IFormFile参数处理

IFormFile 在  Microsoft.AspNetCore.Http 命名空间下

怎么来处理呢?

options.OperationFilter<IdentityServer4OAuth2OperationFilter>();

这是之前处理授权用的,名称就这样了,接下来我在里面去处理

处理方式有几种

你可以根据路由来判断也可以根据参数类型来处理,这里我根据参数类型来处理,只要包含了IFormFile 就生成该文件

第一步:获取IFormFile 参数类型的 参数

var files = context.ApiDescription.ActionDescriptor.Parameters.Where(n => n.ParameterType == typeof(IFormFile)).ToList();

第二步:遍历替换这些参数

 for (int i = ; i < files.Count; i++)
{
if (i == )
{
operation.Parameters.Clear();
}
operation.Parameters.Add(new NonBodyParameter
{
Name = files[i].Name,
In = "formData",
Description = "Upload File",
Required = true,
Type = "file"
}); }
  operation.Consumes.Add("multipart/form-data");
 

这里需要注意的就是这句话

 operation.Parameters.Clear();

需要清除原来中的参数,如果不清除你会看到下面的效果(富含了原有参数 IFormFile)

清除了之后看下实际效果,其实就是替换掉原有的参数形式

这里还有一点值得注意的就是 请求的参数要与 重新添加的参数名称要一致 不然提交获取不到相关的文件信息(如果你是手写的话要注意这点,我这里是动态获取的参数,所以不存在这个问题)

下面是完成代码,这里面附带了 Idr4的授权 不需要可以删除掉

public class IdentityServer4OAuth2OperationFilter : IOperationFilter
{
public void Apply(Operation operation, OperationFilterContext context)
{ #region Swagger授权处理
if (operation.Security == null)
{
operation.Security = new List<IDictionary<string, IEnumerable<string>>>();
}
else
{
operation.Security.Add(new Dictionary<string, IEnumerable<string>>
{ {"oauth2", new List<string> { "openid", "profile", "userservicesapi" }}
});
}
#endregion #region Swagger 文件上传处理 var files = context.ApiDescription.ActionDescriptor.Parameters.Where(n => n.ParameterType == typeof(IFormFile)).ToList();
if (files.Count > )
{
for (int i = ; i < files.Count; i++)
{
if (i == )
{
operation.Parameters.Clear();
}
operation.Parameters.Add(new NonBodyParameter
{
Name = files[i].Name,
In = "formData",
Description = "Upload File",
Required = true,
Type = "file"
}); }
       operation.Consumes.Add("multipart/form-data");
  }
  #endregion
  }
}

选择文件运行下 两个文件都接受到了

最新文章

  1. 使用mvn archetype:generate生产maven工程,响应很慢
  2. [LeetCode] Copy List with Random Pointer 拷贝带有随机指针的链表
  3. Oracle数据库安装图文操作步骤
  4. Web Serveice服务代理类生成及编译
  5. jQuery实现表格行的动态增加与删除 序号 从 1开始排列
  6. Excel中设置下拉列表的来源怎么选择其他工作表的内容
  7. nodejs的第一天学习笔记
  8. JavaScript基础11——js的全局函数
  9. Java核心技术II读书笔记(一)
  10. Codevs_1166_[NOIP2007]_矩阵取数游戏_(动态规划+高精度)
  11. java.lang.IllegalStateException at org.apache.catalina.connector.ResponseFacade
  12. 新出台的治理iMessage垃圾短信的规则
  13. final、finally和finalize的区别
  14. 性能优化-YAHOO军规
  15. ethereum/EIPs-1102 Opt-in provider access metamask不再默认直接连入网页
  16. App Store转让App
  17. django的csrf
  18. 转发:centos彻底删除文件夹、文件命令(centos 新建、删除、移动、复制等命令)
  19. 在css中 父元素不固定高度,怎样实现子元素的高度100%
  20. 20个令人惊叹的音乐应用程序UI,值得收藏

热门文章

  1. python315题
  2. Session in BSU CodeForces - 1027F(思维 树 基环树 离散化)
  3. 【Revit API】墙体分割
  4. BZOJ 1565 [NOI2009]植物大战僵尸 | 网络流
  5. NOI Linux的安装说明以及使用指南
  6. 洛谷P2469 星际竞速
  7. 【洛谷P1892】团伙
  8. github使用记录
  9. 使用solrJ操作solr常用方法 【注释非常详细,非常好】
  10. MongoDB探索之路(三)——索引