将绝对文件路径转换为相对路径

Convert absolute file path to relative

我正在尝试从我的 ASP.NET 核心应用程序的 wwwroot 文件夹中的图像文件夹中提供文件,我已经在 Startup class 中启用了静态文件访问。

HostingEnvironment 服务为我提供了一个 WebRootPath 属性,它为我提供了 wwwroot 文件夹的绝对路径,但是使用这个路径给我一个 "Not Allowed to load local resource" 错误在我的浏览器控制台中。

如果我使用 localhost + 相对路径从我的浏览器访问文件,我可以获得图像文件,因此没有授权问题。

我现在需要的是能够将该绝对路径转换为我的 Web 服务器的相对路径。

为了访问 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

中的文件的所有内容

希望对您有所帮助

鉴于您遇到的错误,在我看来您正试图在您的视图中使用 _env.WebRootPath + "/images/textfile.txt",例如作为 href 属性。

  • 这样做最终会导致浏览器尝试从您的页面请求一个看起来像 file:///C:/Users/PathToYourSite/wwwroot/images/textfile.txt 的 url,这将导致您遇到错误。您可以阅读更多有关 on this answer 的信息,但在像 moder Chrome 这样的浏览器中,默认情况下禁用从 http 协议到文件协议的请求。

因此,当您想要读取文件内容作为服务器端逻辑的一部分时,应该使用 IHostingEnvironment 方法,这样您就可以对它们做一些事情。

但是,如果您需要在 wwwroot 中生成指向您的文件的链接并在您的视图中使用它们,您有几个选择:

  • 使用IUrlHelper将publicurl解析为wwwroot中的一个文件,其中"~/"是wwwroot文件夹。然后在需要时使用它,例如 href:

    @Url.Content("~/images/textfile.txt")
    
  • 直接在 razor 视图中创建一个 href 属性以 "~/" 开头的锚点。 (你甚至可以在那里获得智能感知)

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

这适用于较新版本的 .NET

public class TestController{
   private readonly string _rootPath;

   public TestController(IWebHostEnvironment env)
   {
      _rootPath = env.WebRootPath;
   }
}