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

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

     

  • 相关阅读:
    面向对象第三单元博客作业
    面向对象编程第2次总结(电梯作业)
    面向对象编程第1次总结
    OOP 第四章博客总结
    OO 第三章总结
    OOP 第二章作业总结
    Java 设计模式 -- 代理模式
    ASID 与 MIPS 中 TLB 相关
    Java 锁机制总结
    OOP 第一章作业总结
  • 原文地址:https://www.cnblogs.com/liyouming/p/9310297.html
Copyright © 2020-2023  润新知