Fork me on GitHub

.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
  }
}

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

 

 

 

posted @ 2018-07-14 17:30  龙码精神  阅读(4736)  评论(2编辑  收藏  举报