【问题标题】:Converting physical path to relative one in respect of http://localhost:将物理路径转换为相对于 http://localhost 的相对路径:
【发布时间】:2011-06-08 09:52:32
【问题描述】:

我使用 asp.net 4 和 c#。

我有这段代码可以让我找到图像的物理路径。 如您所见,我得到了我的机器物理 pagh file:///C:.

string pathRaw = HttpContext.Current.Request.PhysicalApplicationPath + "Statics\\Cms\\Front-End\\Images\\Raw\\";

结果:

file:///C:/......../f005aba1-e286-4d9e-b9db-e6239f636e63.jpg

但我需要在我的 Web 应用程序的前端显示此图像,所以我需要这样的结果:

http://localhost:1108/Statics/Cms/Front-End/Images/Raw/f005aba1-e286-4d9e-b9db-e6239f636e63.jpg

怎么做?

PS:我需要转换变量pathRaw的结果

希望我能够表达自己,不幸的是我不确定这种情况下的术语。

感谢您的帮助!

【问题讨论】:

  • 有什么理由不能只使用相对路径(/Statistics/Cms/....)?
  • 感谢 Dave 的评论,但我需要转换 pathRaw 的结果,我不能在我的代码中隐式使用相对路径。你知道怎么做吗?提前感谢
  • 您不能动态地将物理路径转换为 ​​URL - 唯一有意义的是您知道可能的根值,以及它们最终映射到哪个 URL,然后进行一些字符串操作用 URL 替换根路径部分,然后用正斜杠替换反斜杠......但我仍然不明白为什么你需要使用物理路径来访问你的 URL?当然,如果这是在 ASP.NET 应用程序中运行,那么您可以使用相对路径来提供图像?
  • 感谢戴夫的评论!

标签: c# asp.net relative-path


【解决方案1】:

最简单的做法是摆脱物理应用程序路径。 如果您无法在代码中执行此操作,只需将其从 pathRaw 变量中剥离即可。像这样:

public string GetVirtualPath( string physicalPath )
{
   if ( !physicalPath.StartsWith( HttpContext.Current.Request.PhysicalApplicationPath ) )
   {
      throw new InvalidOperationException( "Physical path is not within the application root" );
   }

   return "~/" + physicalPath.Substring( HttpContext.Current.Request.PhysicalApplicationPath.Length )
         .Replace( "\\", "/" );
}

代码首先检查路径是否在应用程序根目录中。如果不是,则无法确定文件的 url,因此会引发异常。

虚拟路径是通过剥离物理应用程序路径构建的,将所有反斜杠转换为斜杠,并在路径前加上 "~/" 前缀,表示它应该被解释为相对于应用程序根目录。

之后,您可以使用ResolveClientUrl(virtualPath) 将虚拟路径转换为相对路径以输出到浏览器。

【讨论】:

    【解决方案2】:

    使用Request.ApplicationPath 获取应用程序的根目录 然后使用来自this question 的答案获取相对路径。

    它可能需要一些调整,但它应该能让你做你想做的事。

    【讨论】:

      【解决方案3】:

      通过 Request.ApplicationPath 左剥离你的 pathRaw 内容并使用构造 url

      Uri navigateUri = new Uri(System.Web.HttpContext.Current.Request.Url, relativeDocumentPath);
      

      【讨论】:

        【解决方案4】:

        利用 ApplicationPath - 获取 ASP.NET 应用程序在服务器上的虚拟应用程序根路径。

        Label1.Text = Request.ApplicationPath;
        Image1.ImageUrl = Request.ApplicationPath + "/images/Image1.gif";
        

        【讨论】:

        • Pranay 我尝试了你的代码(我需要处理 pathRaw 变量),结果如下:localhost:1108/C:/....../… 你知道如何解决它吗?谢谢
        • 我想你忘了设置<asp:Image runat="Server" />
        【解决方案5】:

        您可以为此使用 Server.MapPath。

           string pathRaw = System.Web.HttpContext.Current.Server.MapPath(“somefile.jpg“);
        

        【讨论】:

        • 我需要转换变量 pathRaw...有什么想法吗?
        • 这不是他想要的——他已经有了物理路径,需要将其转换为 URL——这是不可能的。我认为他的做法是错误的。
        • 同意 Dave - 问题是如何从物理到虚拟。
        猜你喜欢
        • 2017-08-01
        • 2011-11-07
        • 2011-05-02
        • 2016-12-14
        相关资源
        最近更新 更多