.Net Core小技巧 - 使用Swagger上传文件

发表于:2018-5-03 09:23

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:编程玩家    来源:博客园

  前言
  随着前后端分离开发模式的普及,后端人员更多是编写服务端API接口。调用接口实现文件上传是一个常见的功能,同时也需要一个选择文件上传的界面,可以编写前端界面上传,可以使用Postman、curl来模拟上传请求。上述的方式多多少少有点麻烦。Swagger作为Api说明文档及调试工具,如果它能提供文件上传的界面(默认不提供),那会更加方便文件上传提示,本文将介绍如何使用Swagger来上传文件。   
  步骤
  1. 安装Swagger
  Install-Package Swashbuckle.AspNetCore
   
  2. 配置Swagger中间件
  在Startup.ConfigureServices中添加:
  services.AddSwaggerGen(c =>
  {
      c.SwaggerDoc("v1", new Info { Title = "My API", Version = "v1" });
  });
   
  在Startup.Configure中添加:
  app.UseSwagger();
  app.UseSwaggerUI(c =>
  {
      c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1");
  }); 
  
  3. 编写API
  // POST api/values
  [HttpPost]
  public void Post(IFormFile file)
  {
      //TODO:Save file...
  }
  // PUT api/values/5
  [HttpPut("{id}")]
  public void Put(int id, IFormFile file)
  {
      //TODO:Save file...
  }
  4. 编写SwaggerFileUploadFilter
  public class SwaggerFileUploadFilter : IOperationFilter
  {
      public void Apply(Operation operation, OperationFilterContext context)
      {
          if (!context.ApiDescription.HttpMethod.Equals("POST", StringComparison.OrdinalIgnoreCase) &&
              !context.ApiDescription.HttpMethod.Equals("PUT", StringComparison.OrdinalIgnoreCase))
          {
              return;
          }
          var fileParameters = context.ApiDescription.ActionDescriptor.Parameters.Where(n => n.ParameterType == typeof(IFormFile)).ToList();
          if (fileParameters.Count < 0)
          {
              return;
          }
          operation.Consumes.Add("multipart/form-data");
          foreach (var fileParameter in fileParameters)
          {
              var parameter = operation.Parameters.Single(n => n.Name == fileParameter.Name);
              operation.Parameters.Remove(parameter);
              operation.Parameters.Add(new NonBodyParameter
              {
                  Name = parameter.Name,
                  In = "formData",
                  Description = parameter.Description,
                  Required = parameter.Required,
                  Type = "file"
              });
          }
      }
  } 
 
  5. 注册SwaggerFileUploadFilter
  c.OperationFilter<SwaggerFileUploadFilter>();
   
  6. 查看结果
  POST方法:  
 
  PUT方法:
   
  原理解析
    使用Swagger的文件上传的关键在于SwaggerFileUploadFilter,它继承于Swashbuckle的IOperationFilter,也即它只作用于Swagger,不会对其它模块造成影响。
    我们再来看一下SwaggerFileUploadFilter里面的Apply方法的逻辑:
    1. 判断请求的方法是否为POST或者PUT,如果是其它请求方法,基本不可能是文件上传操作。
    2. 查找方法中类型为IFormFile的参数。
    3. 设置Consumes为“multipart/form-data”。
    4. 替换IFormFile类型参数描述中的In为formData、Type为File。   
  源码地址
  https://github.com/ErikXu/.NetCoreTips/tree/master/SwaggerFileUpload



上文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理。
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号