首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Swagger为5.0上传FileFilter

Swagger为5.0上传FileFilter
EN

Stack Overflow用户
提问于 2019-11-08 14:30:33
回答 1查看 5.8K关注 0票数 3

是否有人成功地为swagger5.0构建了一个文件过滤器?

我现在有一个用于Swashbuckle.AspNetCore 4.0.1:src=template

但是,由于我迁移到NetCore3.0,我需要将我的swagger更新为5.0。我的FileFilter需要补充,但是我未能成功地迁移文件过滤器。有人能帮忙吗?

用于swagger 4.0.1的当前工作SwaggerUploadFileFilter:

代码语言:javascript
运行
复制
public class SwaggerUploadFileFilter : IOperationFilter
{
    private const string formDataMimeType = "multipart/form-data";
    private static readonly string[] formFilePropertyNames =
        typeof(IFormFile).GetTypeInfo().DeclaredProperties.Select(p => p.Name).ToArray();

    public void Apply(Operation operation, OperationFilterContext context)
    {
        var parameters = operation.Parameters;
        if (parameters == null || parameters.Count == 0) return;

        var formFileParameterNames = new List<string>();
        var formFileSubParameterNames = new List<string>();

        foreach (var actionParameter in context.ApiDescription.ActionDescriptor.Parameters)
        {
            var properties =
                actionParameter.ParameterType.GetProperties()
                    .Where(p => p.PropertyType == typeof(IFormFile))
                    .Select(p => p.Name)
                    .ToArray();

            if (properties.Length != 0)
            {
                formFileParameterNames.AddRange(properties);
                formFileSubParameterNames.AddRange(properties);
                continue;
            }

            if (actionParameter.ParameterType != typeof(IFormFile)) continue;
            formFileParameterNames.Add(actionParameter.Name);
        }

        if (!formFileParameterNames.Any()) return;

        var consumes = operation.Consumes;
        consumes.Clear();
        consumes.Add(formDataMimeType);

        foreach (var parameter in parameters.ToArray())
        {
            if (!(parameter is NonBodyParameter) || parameter.In != "formData") continue;

            if (formFileSubParameterNames.Any(p => parameter.Name.StartsWith(p + "."))
                || formFilePropertyNames.Contains(parameter.Name))
                parameters.Remove(parameter);
        }

        foreach (var formFileParameter in formFileParameterNames)
        {
            parameters.Add(new NonBodyParameter()
            {
                Name = formFileParameter,
                Type = "file",
                In = "formData"
            });
        }
    }
}

尝试使用在线代码为swagger5.0设置代码:

代码语言:javascript
运行
复制
public class SwaggerUploadFileFilter : IOperationFilter
{
    public void Apply(OpenApiOperation operation, OperationFilterContext context)
    {
        if (!(operation?.RequestBody?.Content?.Any(x => x.Key.ToLower() == "multipart/form-data") ?? false)) return;

        var uploadFiles = context.MethodInfo.DeclaringType.GetCustomAttributes(true)
            .Union(context.MethodInfo.GetCustomAttributes(true))
            .OfType<SwaggerUploadFile>();

        if (uploadFiles.Count() == 0) return;

        var uploadFile = uploadFiles.First();

        operation.RequestBody.Content["multipart/form-data"].Schema.Properties =
            new Dictionary<string, OpenApiSchema>
            {
                [uploadFile.Parameter] = new OpenApiSchema
                {
                    Type = "string",
                    Format = "binary",
                    Description = uploadFile.Description
                }
            };

        if (!string.IsNullOrEmpty(uploadFile.Example))
        {
            operation.RequestBody.Content["multipart/form-data"].Schema.Example = new OpenApiString(uploadFile.Example);
            operation.RequestBody.Content["multipart/form-data"].Schema.Description = uploadFile.Example;
        }
    }

    private class SwaggerUploadFile
    {
        public string Parameter { get; set; }

        public string Description { get; set; }

        public string Example { get; set; }
    }
}

我在使5.0版本与IFormFile一起工作时遇到了困难。

如能提供任何协助,我们将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-11 06:00:02

5.0-rc4应该与没有自定义操作过滤器的文件一起工作--如果您有一个[FromForm]参数属性,您只需要删除它。

GitHub问题讨论中指定并测试了自己。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58768489

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档