gpt4 book ai didi

c# - 为 Swagger 的 multipart/form-data 中的文件指定内容类型

转载 作者:行者123 更新时间:2023-11-30 12:54:26 47 4
gpt4 key购买 nike

我已经用这个签名实现了端点

[HttpPost("Test")]
public IActionResult MyTest([Required] IFormFile pdf, [Required] IFormFile image)
{
// some stuff...

return Ok();
}

这会在 swagger.json 中生成以下条目(相关部分)

"content": {
"multipart/form-data": {
"schema": {
"required": [
"image",
"pdf"
],
"type": "object",
"properties": {
"pdf": {
"type": "string",
"format": "binary"
},
"image": {
"type": "string",
"format": "binary"
}
}
},
"encoding": {
"pdf": {
"style": "form"
},
"image": {
"style": "form"
}
}
}
}

但是,我还需要指定编码,比如 the specs (v3)。所以对于我的任务,JSON 应该看起来像这样,我认为......

"encoding": {
"pdf": {
"style": "form",
"contentType": "application/pdf"
},
"image": {
"style": "form",
"contentType": "image/png, image/jpeg"
}
}

但是我怎样才能通过代码做到这一点呢? 我想到了 SwaggerParameter attribute , 但它只包含描述和必需的标志...

我在 .NET Core 2.2 上使用 Swashbuckle.AspNetCore NuGeT 包(版本 5.0.0-rc2)。

最佳答案

如果你看this line ,您会看到编码仅使用 Style 属性创建,而 ContentType 未设置。您可以做的是通过在您定义内容类型的地方创建自定义 Attribute 来手动设置:

[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter,AllowMultiple = false)]
public class OpenApiEncodingContentTypeAttribute : Attribute
{
public OpenApiEncodingContentTypeAttribute(string contentType)
{
ContentType = contentType;
}

public string ContentType { get; }
}

然后在 IOperationFilter 中使用该 Attribute

public class FormContentTypeSchemaOperationFilter : IOperationFilter
{
public void Apply(OpenApiOperation operation, OperationFilterContext context)
{
var contentTypeByParameterName = context.MethodInfo.GetParameters()
.Where(p => p.IsDefined(typeof(OpenApiEncodingContentTypeAttribute), true))
.ToDictionary(p => p.Name, s => s.GetCustomAttribute<OpenApiEncodingContentTypeAttribute>().ContentType);

if (contentTypeByParameterName.Any())
{
foreach (var requestContent in operation.RequestBody.Content)
{
var encodings = requestContent.Value.Encoding;
foreach (var encoding in encodings)
{
if (contentTypeByParameterName.TryGetValue(encoding.Key, out string value))
{
encoding.Value.ContentType = value;
}
}
}
}
}
}

然后用这个 Attribute 装饰你的参数

[HttpPost("Test")]
public IActionResult MyTest([Required] [OpenApiEncodingContentType("application/pdf")] IFormFile pdf, [Required] [OpenApiEncodingContentType("image/png, image/jpeg")] IFormFile image)
{
// some stuff...
return Ok();
}

另外不要忘记在 AddSwaggerGen 中定义您的 IOperationFilter

services.AddSwaggerGen(opts =>
{
// all other stuff
opts.OperationFilter<FormContentTypeSchemaOperationFilter>();
})

这就是你得到的

"requestBody": {
"content": {
"multipart/form-data": {
"schema": {
"required": [
"image",
"pdf"
],
"type": "object",
"properties": {
"pdf": {
"type": "string",
"format": "binary"
},
"image": {
"type": "string",
"format": "binary"
}
}
},
"encoding": {
"pdf": {
"contentType": "application/pdf",
"style": "form"
},
"image": {
"contentType": "image/png, image/jpeg",
"style": "form"
}
}
}
}
}

您可能可以通过额外的检查/空检查和其他适合您需要的东西来改进 IOperationFilter,因为这只是一个基本实现。

关于c# - 为 Swagger 的 multipart/form-data 中的文件指定内容类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56635307/

47 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com