Swashbuckle.AspNetCore 5.0.0-rc4 UploadFileFilter不起作用

时间:2019-11-11 22:08:16

标签: asp.net-core swagger swashbuckle

我需要为Swashbuckle.AspNetCore 5.0.0-rc4添加上载文件。在早期版本中,它的工作方式如下:

public class SwaggerUploadFileParametersFilter : IOperationFilter
{
    public void Apply(Operation operation, SchemaRegistry schemaRegistry, ApiDescription apiDescription)
    {
        if (operation.parameters != null)
        {
            var attribute =
                apiDescription.ActionDescriptor.GetCustomAttributes<UploadFileParametersAttribute>()
                    .FirstOrDefault();
            if (attribute != null)
            {
                operation.consumes.Add("multipart/form-data");
                operation.parameters.Add(new Parameter
                {
                    name = "file",
                    required = true,
                    type = "file",
                    @in = "formData"
                }
                );
            }
        }
    }
}

[UploadFileParameters]
public async Task<IHttpActionResult> MyMethod([FromUri]MyMethodParams parameters)

我尝试使用Microsoft.OpenApi.Models对象来实现它:

   public class SwaggerUploadFileParametersFilter : IOperationFilter
    {
        public void Apply(OpenApiOperation operation, OperationFilterContext context)
        {
            var actionAttributes = context.MethodInfo.GetCustomAttributes<UploadFileParametersAttribute>().FirstOrDefault();
            if (actionAttributes != null)
            {
                operation.RequestBody = new OpenApiRequestBody()
                {
                    Content =
                    {
                        ["multipart/form-data"] = new OpenApiMediaType()
                        {
                            Schema = new OpenApiSchema()
                            {
                                Properties =
                                {
                                    ["file"] = new OpenApiSchema()
                                    {
                                        Description = "Select file",
                                        Type = "file"
                                    }
                                }
                            }
                        }
                    }
                };
            }
        }
    }

但是它不起作用。我看不到文件组件

1 个答案:

答案 0 :(得分:1)

我从Swagger File Upload那里获取了您的代码和一些文档

我修改了您的代码并添加了小补丁

public class SwaggerUploadFileParametersFilter : IOperationFilter
{
    public void Apply(OpenApiOperation operation, OperationFilterContext context)
    {
        var parameters = operation.Parameters;
        if (parameters == null || parameters.Count == 0)
        {
            return;
        }
        var isUploadFile = context.ApiDescription.ActionDescriptor.Parameters.Any(x => x.ParameterType == typeof(IFormFile));

        if (isUploadFile)
        {
            operation.RequestBody = new OpenApiRequestBody()
            {
                Content =
                {
                    ["multipart/form-data"] = new OpenApiMediaType()
                    {
                        Schema = new OpenApiSchema()
                        {
                            Type = "object",
                            Properties =
                            {
                                ["file"] = new OpenApiSchema()
                                {
                                    Description = "Select file", Type = "string", Format = "binary"
                                }
                            }
                        }
                    }
                }
            };
        }
    }
}

和控制器:

[HttpPost]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesDefaultResponseType]
public async Task<IActionResult> UploadFileAsync([FromForm] IFormFile file)