Итак, у меня есть 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"
});
}
}
}