Преобразовать абсолютный путь к файлу в относительный

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

на HostingEnvironment сервис предоставляет мне WebRootPath свойство, которое предоставляет мне абсолютный путь к папке wwwroot, но использование этого пути дает мне ошибку "не разрешено загружать локальный ресурс" в консоли моего браузера.

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

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

2 ответов


учитывая ошибку, которую вы получаете, мне кажется, что вы пытаетесь использовать _env.WebRootPath + "/images/textfile.txt" в ваших представлениях, например, как атрибут href.

  • это приведет к тому, что браузер попытается запросить с вашей страницы url-адрес, который выглядит как file:///C:/Users/PathToYourSite/wwwroot/images/textfile.txt, который заканчивается ошибкой, которую вы испытываете. Вы можете прочитать больше об этом на этот ответ, но в браузерах, таких как moder Chrome, запросы от протокола http к файловому протоколу отключаются по умолчанию.

так IHostingEnvironment подход должен использоваться, когда вы хотите прочитать содержимое файла как часть логики на стороне сервера, чтобы вы могли что-то с ними сделать.

однако, если вам нужно создать ссылки на ваши файлы в wwwroot и использовать их в своих представлениях, у вас есть несколько вариантов:

  • использовать IUrlHelper чтобы разрешить общедоступный url-адрес файла внутри wwwroot, где "~/" - это папка wwwroot. Затем использовать ее всякий раз, когда вам это нужно, как с href:

    @Url.Content("~/images/textfile.txt")
    
  • непосредственно создайте якорь в представлении razor с атрибутом href, начинающимся с "~/". (Вы даже получаете intellisense там)

    <a href="~/images/textfile.txt">Get file from wwwroot</a>
    

чтобы получить доступ к файлу в wwwroot, введите IHostingEnvironment в вас конструктор контроллера:

private IHostingEnvironment _env;

public HomeController(IHostingEnvironment env)
{
    _env = env;
}

обновите контроллер, чтобы прочитать WebRootPath свойство и добавьте к нему относительный путь к файлу

var content = System.IO.File.ReadAllText(_env.WebRootPath + "/images/textfile.txt");

это прочитает все содержимое файла, расположенного внутри / wwwroot/images / textfile.txt

надеюсь, что это поможет