asp.net core 2 загружает и отображает образы с локального диска - PullRequest
1 голос
/ 27 марта 2019


Есть ли способ отобразить изображение в веб-приложении asp.net core 2 (razor) с локального диска?

Причина, по которой я хочу это сделать, заключается в том, что я разрабатываю игровой сервер, который содержит игровой сервер и два веб-сайта (интерфейс и панель администратора), и всем этим потребуется доступ к упомянутым изображениям, которые в данном случае являются изображениями профиля. и именно поэтому я не поместил эти изображения в папку wwwroot.

Пример изображения изображения: "C: \ game_data \ avatars \ default.png"

1 Ответ

2 голосов
/ 27 марта 2019

В большинстве случаев самым безопасным (и самым простым) вариантом является хранение изображений в корневой папке сайта, чтобы избежать предоставления учетной записи веб-сайта доступа вне самой папки сайта.

Изображения профиля пользователя не являются статичными . Вот почему они часто хранятся в базе данных или другом хранилище.

Вы можете сопоставить конкретный путь запроса с пользовательским местоположением в UseStaticFiles . Из примера документации:

public void Configure(IApplicationBuilder app)
{
    app.UseStaticFiles(); // For the wwwroot folder

    app.UseStaticFiles(new StaticFileOptions
    {
        FileProvider = new PhysicalFileProvider(
            Path.Combine(Directory.GetCurrentDirectory(), "MyStaticFiles")),
        RequestPath = "/StaticFiles"
    });
}

Первый вызов настраивает wwwroot в качестве корня для статических файлов. Второй вызов отменяет это для запросов, начинающихся с /StaticFiles, и указывает на папку с именем MyStaticFiles в папке приложения.

Вы можете выставить все изображения профиля в пути avatar с этим кодом:

public void Configure(IApplicationBuilder app)
{
    app.UseStaticFiles(); // For the wwwroot folder

    app.UseStaticFiles(new StaticFileOptions
    {
        FileProvider = new PhysicalFileProvider(
            "X:\game_data\avatars\"),
        RequestPath = "/avatars"
    });
}

Лучшим вариантом было бы загрузить местоположение из файла конфигурации.

Другое соображение заключается в том, что простое сопоставление папки с путем позволит любому прочитать изображения профиля, если они смогут угадать свое имя. Это может или не может быть проблемой.

Если равно , вы используете контроллер, который возвращает текущего пользователя только в качестве FileResult, например:

class AvatarsController
{
    [HttpGet]
    public async Task<IActionResult> Get()
    {
        var userID=SomehowFindTheCurrentUserID();
        var avatarPath= Path.Combine(_avatarRoot,$"{userID}.jpeg");
        return File(avatarPath, "image/jpeg");
    }
} 
...