ASP .Net Core Swagger UI IFormFile не работает

Я добавил метод загрузки (HTTPPOST), чтобы загрузить простой файл. Я продолжаю получать эту ошибку и не знаю, откуда она взялась. Может кто-нибудь объяснить это, пожалуйста?

И, может быть, есть кто-то, кто также может ответить на этот вопрос, он не самый важный, но вы можете передать фильтр расширений файлов этому фильтру операций? Что он принимает только.csv например? Или это то, что мы должны позже сделать во внешнем интерфейсе, как при проверке внутреннего интерфейса, какое расширение у него есть, когда оно уже загружается?

ОШИБКА: 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 ответ

Это не имеет ничего общего с чванством. 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();
}

Я не стал бы слишком сильно его проектировать для загрузки файлов.

Другие вопросы по тегам