Маршрутизация запросов к файлам ASP NET Web API
Расскажите, как вы делаете маршруты для получения файлов
Я нашёл способ, как это сделать, но мне кажется, что есть более лучший
Я сделал контроллер, который возвращает изображение в ответ на запрос
[HttpGet("getImage/{folder}/{file}")]
public IActionResult GetImage(string folder, string file)
{
string path = Path.Combine(_environment.WebRootPath, "images", folder, file);
FileStream fileStream = new FileStream(path, FileMode.Open);
string extension = Path.GetExtension(file);
return new FileStreamResult(fileStream, GetContentType(extension));
}
public string GetContentType(string extension)
{
switch (Path.GetExtension(extension))
{
case ".bmp": return "Image/bmp";
case ".gif": return "Image/gif";
case ".jpg": return "Image/jpeg";
case ".png": return "Image/png";
default: break;
}
return "";
}
Затем я зарегистрировал маршрут, который ведёт к контроллеру
public void Configure(IApplicationBuilder app)
{
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "GetImage",
pattern: "media/getImage/{folder}/{file}"
);
});
}
Теперь я покажу, как сохраняю файлы в каталоге
Сначала я объявляю, название папки, в которой будет сохранён файл
string folder = "products"; // Объявляю, папку в которую надо сохранить файл
string folderPath = Path.Combine("images", folder, productDto.Image.FileName); // Создаю путь /images/products/image.png
string filePath = Path.Combine(_environment.WebRootPath, folderPath); // Создаю абсолютный путь к файлу, который ведёт к /wwwroot/images/products/image.png
productDto.Image.CopyTo(new FileStream(filePath, FileMode.CreateNew)); // Сохраняю файл
Недостаток моего решения
Если название каталога будет изменено с /images/products на /photos/people/, то мне придётся перечитывать весь код и искать места, где встречается /images и /products, чтобы изменить их.
Мне хочется, чтобы у меня была всего одна точка доступа, которая будет хранить в себе название каталогов. Таким образом, если я изменю название каталогов в этой точке, то название каталогов будет изменено везде, и мне не придётся перечитывать код, чтобы изменить /images/products на /photos/people/
Я придумал решение, но может есть более лучший способ?
Моё решение
public static string GetImagesFolderName()
{
return "images";
}
public static string GetProductsFolderName()
{
return "products";
}
Теперь если мне придётся создать путь к папке /images/products, то я сделаю так
string path = Path.Combine(GetImagesFolderName(), GetProductsFolderName());
Если название каталога images изменится на photos, то я просто изменю метод GetImagesFolderName, и теперь везде в коде будут генерироваться пути /photos/products/.
public static string GetImagesFolderName()
{
return "photos";
}