前言

   随着前后端分离开发模式的普及,后端人员更多是编写服务端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

参考资料

总结

以上所述是www.887551.com给大家介绍的如何使用swagger上传文件,希望对大家有所帮助