使用 Swagger 5.0.0-rcX 和 .Net-Core 3 上传文件

Sam*_*ino 5 c# file-upload swagger asp.net-core .net-core-3.0

我正在使用 .NetCore 3 和 Swagger 5.0.0-rc4。我正在尝试使用 Swagger 上传文件(图像)但它不起作用,因为 IOperationFilter 甚至 Swashbuckle.AspNetCore.Swagger 中的 apply 方法缺少一些属性。例如 NonBodyParameter 和 Consumes 不会在 Swagger 5.0 中退出

有没有人使用面临同样的问题或试图解决它?

public class FileOperationFilter : IOperationFilter
    {

        public void Apply(OpenApiOperation 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");
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

Vin*_*ssi 5

我设法在 Swashbuckle.AspNetCore 6.1.5 中解决了这个问题

Swagger 自动将 IFormFile 识别为multipart/form-data媒体类型。

您只需删除过滤器类并从控制器中的参数中删除[FromForm]or属性即可。[FromBody]

void Post([FromForm] IFileForm file)<= 旧的

void Post(IFileForm file)<=新的

  • 这适用于版本 6.5.0。如果有人想知道“文件上传输入在哪里?”,您必须单击“尝试一下”按钮才能实际看到文件输入 (2认同)

小智 2

AS 缺少的参数现在这些已更改为 OpenApiParameter 和 OpenApiOperation。

public void Apply(OpenApiOperation operation, OperationFilterContext context)
        {
            if (operation.OperationId == "MyOperation")
            {
                operation.Parameters.Clear();
                operation.Parameters.Add(new OpenApiParameter
                {
                    Name = "formFile",
                    In = ParameterLocation.Header,
                    Description = "Upload File",
                    Required = true,
                    Schema= new OpenApiSchema
                    {
                        Type="file",
                        Format="binary"
                    }
                }); 
                var uploadFileMediaType = new OpenApiMediaType()
                {
                    Schema = new OpenApiSchema()
                    {
                        Type = "object",
                        Properties =
                    {
                        ["uploadedFile"] = new OpenApiSchema()
                        {
                            Description = "Upload File",
                            Type = "file",
                            Format = "binary"

                        }
                    },
                        Required = new HashSet<string>()
                    {
                        "uploadedFile"
                    }
                    }
                };
                operation.RequestBody = new OpenApiRequestBody
                {
                    Content =
                {
                    ["multipart/form-data"] = uploadFileMediaType
                }
                };


            }
        }
Run Code Online (Sandbox Code Playgroud)