.NetCore WebApi利用Swagger文档实现选择文件上传
介绍
实现这个功能主要还是依赖过滤器
在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 = 0; i < files.Count; i++) { if (i == 0) { 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 > 0) { for (int i = 0; i < files.Count; i++) { if (i == 0) { 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
}
}
选择文件运行下 两个文件都接受到了
如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!
本文版权归作者和博客园共有,来源网址:http://www.cnblogs.com/liyouming欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接。