Маршрутизация запросов к файлам 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";
}

Ответы (0 шт):