swagger 上传文件 参数_使用Swagger直接上传文件的方法

经常使用swagger,可以通过设置[ProducesResponseType]标记接口的返回信息;swagger也能通过接口的参数列表,自动获得发送的数据结构信息。

不过有一个例外,就是上传文件的时候,设置了[Consumes]的内容为multi-part/form-data,但是swagger并不能正常感知是上传文件的。代码是这个样子的:

关于文件上传的细节,可以看多年前我写过一篇有关通过WEBAPI上传文件的文章。

Copy

[Consumes("multipart/form-data")]

[ODataRoute]

[HttpPost]

public async Task Post(IFormCollection collection)

{

var file = collection.Files[0];

if(file != null)

{

var filename = DateTime.Now.ToString("yyyyMMddHHmmss") + file.FileName;

var path = Path.Combine(_webHostEnvironment.WebRootPath, "Files", filename);

using FileStream fileStream = new FileStream(path, FileMode.Create);

await file.CopyToAsync(fileStream);

var uri = "Files/" + filename;

var fileEntity = new Models.File { Url = uri, LastModified = DateTime.Now };

_homeworkDataContext.Files.Add(fileEntity);

await _homeworkDataContext.SaveChangesAsync();

return Created(WebUtility.UrlEncode(uri), fileEntity);

}

return BadRequest();

}

实际上,swagger一直提示,上传的内容是一个array类型,当然API是没有问题的,可以通过POSTMAN进行发送,不过不能在网页上直接操作,总觉得心里有点不太舒服。

方法#

搜索了一下办法,比较靠谱的,就是通过增加一个IOperationFilter来实现目的。

Copy

// CODE FROM https://www.talkingdotnet.com/how-to-upload-file-via-swagger-in-asp-net-core-web-api/

public class FileUploadOperation : IOperationFilter

{

public void Apply(Operation operation, OperationFilterContext context)

{

if (operation.OperationId.ToLower() == "apivaluesuploadpost")

{

operation.Parameters.Clear();

operation.Parameters.Add(new NonBodyParameter

{

Name = "uploadedFile",

In = "formData",

Description = "Upload File",

Required = true,

Type = "file"

});

operation.Consumes.Add("multipart/form-data");

}

}

}

然后,在services.ConfigureSwaggerGen()参数中,添加

Copy

options.OperationFilter();

方法的原理是通过重写操作某个特定API的的过滤器,来实现对返回内容的操作。

此方法适用于OAS2,实质上是实现了这里的规范要求。

我已经用上.NET 5.0了,自带了swagger都支持的是OpenAPI 3,这个方法不好用了。不过思想应该相同,首先看看OpenAPI 3的规范,文件上传需要定义为:

Copy

requestBody:

content:

multipart/form-data:

schema:

type: object

properties:

fileName:

type: string

format: binary

这个套路和OpenAPI 2完全不一样,需要重新设置requestBody才行。我们按照要求改造代码。

Copy

public class FileUploadOperation : IOperationFilter

{

public void Apply(OpenApiOperation operation, OperationFilterContext context)

{

//判断上传文件的类型,只有上传的类型是IFormCollection的才进行重写。

if (context.ApiDescription.ActionDescriptor.Parameters.Any(w => w.ParameterType == typeof(IFormCollection)))

{

Dictionary schema = new Dictionary();

schema["fileName"] = new OpenApiSchema { Description = "Select file", Type = "string", Format = "binary" };

Dictionary content = new Dictionary();

content["multipart/form-data"] = new OpenApiMediaType { Schema = new OpenApiSchema { Type = "object", Properties = schema } };

operation.RequestBody = new OpenApiRequestBody() { Content = content };

}

}

}

亚马逊测评 www.yisuping.cn

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值