Преобразовать абсолютный путь к файлу в относительный
Я пытаюсь обслуживать файлы из моей папки изображений внутри папки 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
надеюсь, что это поможет