返回到 Web 相对路径的绝对路径
Posted
技术标签:
【中文标题】返回到 Web 相对路径的绝对路径【英文标题】:Absolute path back to web-relative path 【发布时间】:2010-09-05 09:55:44 【问题描述】:如果我已设法使用 Server.MapPath 找到并验证文件是否存在,并且我现在想将用户直接发送到该文件,那么转换该绝对路径的最快方法是什么回到相对网络路径?
【问题讨论】:
【参考方案1】:对于 asp.net 核心,我编写了辅助类来获取两个方向的路径。
public class FilePathHelper
private readonly IHostingEnvironment _env;
public FilePathHelper(IHostingEnvironment env)
_env = env;
public string GetVirtualPath(string physicalPath)
if (physicalPath == null) throw new ArgumentException("physicalPath is null");
if (!File.Exists(physicalPath)) throw new FileNotFoundException(physicalPath + " doesn't exists");
var lastWord = _env.WebRootPath.Split("\\").Last();
int relativePathIndex = physicalPath.IndexOf(lastWord) + lastWord.Length;
var relativePath = physicalPath.Substring(relativePathIndex);
return $"/ relativePath.TrimStart('\\').Replace('\\', '/')";
public string GetPhysicalPath(string relativepath)
if (relativepath == null) throw new ArgumentException("relativepath is null");
var fileInfo = _env.WebRootFileProvider.GetFileInfo(relativepath);
if (fileInfo.Exists) return fileInfo.PhysicalPath;
else throw new FileNotFoundException("file doesn't exists");
从 Controller 或服务注入 FilePathHelper 并使用:
var physicalPath = _fp.GetPhysicalPath("/img/banners/abro.png");
反之亦然
var virtualPath = _fp.GetVirtualPath(physicalPath);
【讨论】:
【参考方案2】:也许这可行:
String RelativePath = AbsolutePath.Replace(Request.ServerVariables["APPL_PHYSICAL_PATH"], String.Empty);
我用的是c#,但是可以适应vb。
【讨论】:
@GateKiller:请注意,如果您在网站中使用 IIS 虚拟目录,您的解决方案可能会失败,因为应用程序物理路径可能与文件的物理路径不同。【参考方案3】:我知道这很旧,但我需要考虑虚拟目录(根据 @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.");
【讨论】:
【参考方案4】:我喜欢 Canoas 的想法。不幸的是,我没有可用的“HttpContext.Current.Request”(BundleConfig.cs)。
我改变了这样的方法:
public static string RelativePath(this HttpServerUtility srv, string path)
return path.Replace(HttpContext.Current.Server.MapPath("~/"), "~/").Replace(@"\", "/");
【讨论】:
【参考方案5】:拥有Server.RelativePath(path)不是很好吗?
好吧,你只需要扩展它;-)
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);
【讨论】:
物理路径更好的替代品是 ~/. path.Replace(context.ServerVariables("APPL_PHYSICAL_PATH"), "~/")【参考方案6】:如果您使用了 Server.MapPath,那么您应该已经有了相对 Web 路径。根据MSDN documentation,该方法采用一个变量path,它是Web 服务器的虚拟路径。因此,如果您能够调用该方法,您应该已经可以立即访问相对 Web 路径。
【讨论】:
这不一定正确 - MapPath 调用可能已由另一种方法执行并传递到/从我的文件检查器方法调用,或者(在我的情况下)由许多不同的元素构建,一个其中是我的资源目录(定义为“~/__Resources”)。显然,将用户引导至此路径会导致意想不到的结果。知道这一点也很有用,因为有时绝对文件路径可能已从数据库中提取出来而没有其他上下文信息。 @tagsk - 我不知道。顺便说一句,定义方法时,如果您输入到 Server.MapPath 中的字符串是有效的并返回一个物理服务器路径,那么无论您如何生成它,这也必须是一个有效的虚拟路径。关于虚拟地址开头的波浪号 (~) 的使用,请参阅 ASP.NET Web Site Paths 上的这篇 MSDN 文章: > ASP.NET 包含 Web 应用程序 > 根运算符 (~),您可以在指定路径时使用 >服务器 > c Yaakov - 不是这样。例如,我使用的函数采用根路径并递归返回IEnumerable<FileInfo>
集合。在我的 Web 应用程序中,我可以提供此路径,将我的相对路径解析为物理路径,但是当我返回此递归列表并希望将它们映射回我的应用程序中的相对路径时,我没有该信息。以上是关于返回到 Web 相对路径的绝对路径的主要内容,如果未能解决你的问题,请参考以下文章