Не удается импортировать / выгружать файлы Excel (.xlsx) в Swagger (ASP NET Core Web API) - PullRequest
0 голосов
/ 11 июля 2019

Итак, у меня есть ASP NET Core Web API, который использует Swagger, и один из методов должен импортировать IFormFile как Excel (.xlsx или .xls).

Я уже добавил соответствующие типы MIME в файл FileUploadOperation.cs, но когда я нажимаю кнопку Swagger, выполняю действие после выбора файла .xlsx, поле становится красным, и я не могу импортировать файл.

Код выше - мой FileUploadOperation.cs:

Уже добавлены типы MIME для файлов Excel, но ничего не меняется.

public class FileUploadOperation : IOperationFilter
    {
        private const string formDataMimeType = "multipart/form-data";
        private const string formDataMimeType2 = "application/vnd.ms-excel";
        private const string formDataMimeType3 = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";

        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);

            if (operation.OperationId.Equals("PostProcessBatch"))
            {
                consumes.Add(formDataMimeType2);
                consumes.Add(formDataMimeType3);
            }

            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"
                });
            }
        }
    }
...