Asp.Net Core 2.0 - получение URL-адреса изображения - PullRequest
0 голосов
/ 22 мая 2018

Я пытаюсь создать спокойный сервис, который предоставляет некоторые данные, все было просто отлично, пока я не понял, что мучительно представлять полный URL-адрес изображений с сервера.Может быть, это только я, но я нахожу это очень сложным.

Просто чтобы быть в контексте, я использую Entity Framework для чтения из моей базы данных, вот таблица, с которой я работаю:

enter image description here

Как видите, есть поле с именем «ImagePath», парни с плохим именем, это должно быть «ImageName», независимо от того, что в этом столбце сохраняется точное имя файлаизображения, представляющего этот объект Champion, все изображения в данный момент находятся в папке проекта wwwroot, например:

enter image description here

Вся бизнес-логиканаходится не на контроллере, находится в папке / слое службы обычного класса (возможно, это не имеет значения, но я просто хотел уточнить, что я не работаю внутри какого-либо контроллера):

enter image description here

И в этом методе я ожидаю, что волшебство произойдет:

public async Task<IList<Champion>> GetChampions()
{
   List<Champion> champions = await _context.Champion
   .Include(x => x.PrimaryClass)
   .Include(x => x.SecondaryClass)
   .Include(x => x.ChampionUserRate)
   .ToListAsync();

   //BEFORE RETURNING THE CHAMPION TO THE CONTROLLER, I WILL NEED TO CONCATENATE MY CURRENT SERVER URL AND THE PATH TO THE IMAGE PLUS THE IMAGE NAME FILE WHICH IS ALREADY IN THE DATABASE AND ALREADY MATCHES THE IMAGES FOLDER

   string serverPathToChampionsFolder = null; //Example: http://localhost:57435/wwwroot/Champions

   foreach (var champion in champions)
   {
       champion.ImagePath = serverPathToChampionsFolder + champion.ImagePath;
   }

return champions;
}

Просто чтобы прояснить это, ключевая строка здесь:

 string serverPathToChampionsFolder = null; //Example: http://localhost:57435/wwwroot/Champions

Мне нужно как-то получить текущий URL, как в примере, чтобыдобавьте его к каждому чемпиону, чтобы его можно было использовать на стороне клиента внутри тега изображения.

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

1 Ответ

0 голосов
/ 22 мая 2018

По сути, вам нужно использовать IHostingEnvironment и добавить его в конструктор сервисов.Затем создайте строковую переменную с именем вашей папки внутри wwwroot, скажем, "Champions"

Вот пример кода:

private readonly IHostingEnvironment hostingEnv;

private const string ChampionsImageFolder = "Champions";

public ChampionsService(IHostingEnvironment hostingEnv){
    this.hostingEnv = hostingEnv;
}

// Suppose this method is responsible for fetching image path
public string GetImage(){
    var path = Path.Combine(hostingEnv.WebRootPath, ChampionsImageFolder);

    return path;
}

Что делает IHostingEnvironment интерфейс "Предоставляет информацию осреда размещения, в которой запущено приложение. "

Если вы хотите получить файлы внутри указанного пути, это даст вам подсказку.

var directoryFiles = Directory.GetFiles("wwwroot/Champions");

foreach (var item in directoryFiles)
{
    // do something here
}

Если вы хотите создать ссылку на путь из этой папки wwwroot, вам необходимо зарегистрироваться в вашемзапустите UseDirectoryBrowser

Внутри вашего файла Startup.cs найдите метод Configure и вставьте этот фрагмент кода

Эти фрагменты кода предоставят файлы в каталоге Champions и создадут новыймаршрут на вашем сайте, который ChampionImages получен из папки Champions в вашем wwwroot

app.UseDirectoryBrowser(new DirectoryBrowserOptions()
{
    FileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(), @"wwwroot", "Champions")),
    RequestPath = new PathString("/ChampionImages")
});

Тогда вы можете теперь использовать что-то вроде этого localhost:8080/ChampionImages, где вы можете увидеть каждый файл, хранящийся внутри чемпионовпапка вашего wwwroot.То, что вы можете сделать, чтобы создать URL этого изображения, выглядит примерно так:

var imageUrl = $"/ChampionImages/{exactFileName}"; // this will create a string link.

Я надеюсь, что этот простой фрагмент кода даст вам помощь или идею:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...