绝对路径回到网络相对路径

如果我已经设法使用Server.MapPath来查找和验证文件的存在,我现在想直接将用户发送到该文件,那么将该绝对路径转换回为最快的最快方式是什么相对网络路径?

0
额外 编辑
意见: 1

5 答案

如果您使用Server.MapPath,那么您应该已经拥有相关的Web路径。根据 MSDN文档,此方法需要一个变量, path ,它是Web服务器的虚拟路径。所以如果你能够调用这个方法,你应该已经可以立即访问相关的web路径。

0
额外
这不一定是正确的 - MapPath调用可能已经由另一个方法执行,并从我的文件检查器方法传入/调用,或者(在我的情况下)由许多不同元素构建,其中之一是我的资源目录(已定义作为“〜/ __ Resources”)。很明显,将用户引导至此路径将导致意想不到的结果。这也是有用的知道,因为有时绝对文件路径可能已经从数据库中拉出,没有其他上下文信息。
额外 作者 tags2k,
@tagsk - 我不知道。通过定义方法,如果输入到Server.MapPath中的字符串是有效的并返回物理服务器路径,那么无论您如何生成它,它都必须是有效的虚拟路径。有关在虚拟地址开头使用波形符号(〜)的信息,请参阅此MSDN文章 ASP.NET网站路径:> ASP.NET包含Web应用程序>根操作符(〜),您可以在服务器中指定路径时使用>> c
额外 作者 Yaakov Ellis,
雅科夫 - 并非如此。例如,我使用的函数采用根路径并递归地返回 IEnumerable 集合。在我的web应用程序中,我可以提供这条路径来解析我的相对路径,但是当我回到这个递归列表并希望将它们映射回我的应用程序中的相对路径时,我没有那些信息。
额外 作者 one.beat.consumer,

也许这可能工作:

String RelativePath = AbsolutePath.Replace(Request.ServerVariables["APPL_PHYSICAL_PATH"], String.Empty);

我正在使用c#,但可以适应vb。

0
额外
@ GateKiller :请注意,如果您在您的网站中使用IIS虚拟目录,您的解决方案可能会失败,因为应用程序物理路径可能与文件的物理路径不同。
额外 作者 Costo,
这只适用于请求的上下文中。
额外 作者 bzlm,

我知道这是旧的,但我需要考虑虚拟目录(per @ Costo的评论)。这似乎有助于:

static string RelativeFromAbsolutePath(string path)
{
    if(HttpContext.Current != null)
    {
        var request = HttpContext.Current.Request;
        var applicationPath = request.PhysicalApplicationPath;
        var virtualDir = request.ApplicationPath;
        virtualDir = virtualDir == "/" ? virtualDir : (virtualDir + "/");
        return path.Replace(applicationPath, virtualDir).Replace(@"\", "/");
    }

    throw new InvalidOperationException("We can only map an absolute back to a relative path if an HttpContext is available.");
}
0
额外

拥有 Server.RelativePath(路径)不是很好吗?

好吧,你只需要扩展它;-)

public static class ExtensionMethods
{
    public static string RelativePath(this HttpServerUtility srv, string path, HttpRequest context)
    {
        return path.Replace(context.ServerVariables["APPL_PHYSICAL_PATH"], "~/").Replace(@"\", "/");
    }
}

有了这个,你可以直接打电话

Server.RelativePath(path, Request);
0
额外
更好地替代物理路径将是〜/。 path.Replace(context.ServerVariables(“APPL_PHYSICAL_PATH”),“〜/”)
额外 作者 Josh Russo,

我喜欢Canoas的想法。不幸的是,我没有提供“HttpContext.Current.Request”(BundleConfig.cs)。

我改变了这样的方法:

public static string RelativePath(this HttpServerUtility srv, string path)
{
     return path.Replace(HttpContext.Current.Server.MapPath("~/"), "~/").Replace(@"\", "/");
}
0
额外