Рубрики
ASP.NET Разработка

Загрузка (Прикрепление) файлов с использованием Swagger asp.net core

Swagger – очень удобный способ документировать конечные точки API REST или «кастомных» бэков. Он обеспечивает создание документации на лету на основе структуры кода, что значительно сокращает время создания документации. Это оставляет разработчику больше времени для того, чтобы сосредоточиться на проблеме, а не на фактическом написании документации.

Большинство вещей в Swagger поставлено из коробки, означая, что большая часть работы будет сделана просто путем добавления ссылок на пакеты Swashbuckle NuGet и подключения их в контейнере и конвейере ASP.NET Core DI.

Однако всегда есть вещи, которые требуют тонкой настройки. Это некоторые требования и функциональные возможности, которые используете в отдельном проекте, и которые приходиться использовать каждый раз повторно прибегая к сторонним средствам. Одной из таких вещей является загрузка файлов. Swagger хорош в том, что касается простых текстовых / json-сообщений, но как только вам понадобится смешанный контент для отправки на какую-то конечную точку, вам придется немного покопаться в коде и выполнить те тонкие настройки, которые будут расписаны ниже.

Процесс подключения Swagger не будет расписан, перейдем сразу к коду. Предполагается что у Вас уже настроен Swagger и есть контроллер для загрузки файлов.

Ниже приведен пример метода обработчика загрузки файлов:


        [HttpPost]
        [Route("api/appFiles")]
        [RequestSizeLimit(100_000_000)]
        public async Task<ActionResult<IFormFile>> Post(IFormFile[] uploadedFiles)
        {

И swagger не «генерит» нам инпут для загрузки файла

И предполагаем следующий вариант решения этой задачи путем использования механизма фильтров. Для преодоления этой проблемы мы можем реализовать интерфейс Swashbuckle.AspNetCore.SwaggerGen.IOperationFilter и добавить его в параметры Swagger. Этот фильтр позволит нам контролировать поведение Swagger UI для конкретного параметра методов конечной точки в контроллере.

/// <summary>
    /// Обработчик загрузки файлов
    /// </summary>
    public class SwaggerFileOperationFilter : IOperationFilter
    {
        /// <summary>
        /// Применение фильтров
        /// </summary>
        /// <param name="operation"></param>
        /// <param name="context"></param>
        public void Apply(Operation operation, OperationFilterContext context)
        {
            if (context.ApiDescription.RelativePath == "api/appFiles" &&  operation.OperationId == "Post")
            {
                operation.Parameters = new List<IParameter>
                {
                    new NonBodyParameter
                    {
                        Name = "uploadedFiles",
                        Required = true,
                        Type = "file",
                        In = "formData",
                        Description = "Укажите путь к файлу и нажмите загрузить"
                    }
                };
            }
        }
    }

Если вы не укажите какой путь роута использовать то параметр добавиться ко всем методам POST.

Применяем изменения загружаемся и видим что у нас появилась возможность прикрепления файлов в Swagger

Ваши Коментарии и вопросы можете оставлять в ВК.