ASP .Net Core Swagger UI IFormFile不起作用

时间:2017-05-30 14:59:51

标签: asp.net-core swagger-ui iformfile

我添加了一个上传方法(HTTPPOST)来上传一个简单的文件。我一直收到这个错误,不知道它来自哪里。有人可以解释一下吗?

也许有人可以回答这个问题,这不是最重要的问题,但是你可以将文件扩展名过滤器传递给这个操作过滤器吗?它只接受.csv吗?或者是我们稍后应该在前端做什么,如后端检查它已经上传时的扩展名?

ERROR:1

发布方法:

[HttpPost]
[Consumes("multipart/form-data")]
public void Post(IFormFile file)
{
}

OperationFilter:

public class FormFileOperation : IOperationFilter
{
    private const string FormDataMimeType = "multipart/form-data";
    private static readonly string[] FormFilePropertyNames = typeof(IFormFile).GetTypeInfo().DeclaredProperties.Select(x => x.Name).ToArray();

    public void Apply(Operation operation, OperationFilterContext context)
    {
        if (context.ApiDescription.ParameterDescriptions.Any(x => x.ModelMetadata.ContainerType == typeof(IFormFile)))
        {
            var formFileParameters = operation
                .Parameters
                .OfType<NonBodyParameter>()
                .Where(x => FormFilePropertyNames.Contains(x.Name))
                .ToArray();
            var index = operation.Parameters.IndexOf(formFileParameters.First());
            foreach (var formFileParameter in formFileParameters)
            {
                operation.Parameters.Remove(formFileParameter);
            }

            var formFileParameterName = context
                .ApiDescription
                .ActionDescriptor
                .Parameters
                .Where(x => x.ParameterType == typeof(IFormFile))
                .Select(x => x.Name)
                .First();
            var parameter = new NonBodyParameter()
            {
                Name = formFileParameterName,
                In = "formData",
                Description = "The file to upload.",
                Required = true,
                Type = "file"
            };
            operation.Parameters.Insert(index, parameter);

            if (!operation.Consumes.Contains(FormDataMimeType))
            {
                operation.Consumes.Add(FormDataMimeType);
            }
        }
    }
}

1 个答案:

答案 0 :(得分:0)

这与招摇没有任何关系。 swagger是规范而不是实现。 我会做的单向停止接受任何其他文件扩展名。

这是伪代码,您需要更改并编译它。

[HttpPost("upload")]
public async Task<IActionResult> Upload()
{
   files = Request.Files;
    foreach (var file in files)
    {
       if(!file.FileName.EndWith('.csv'))
       continue;

       Save/UploadFile
    }

    return Ok();
}

对于文件上传,我不会过度设计它。