Absolutní cesta zpět na webové relativní cesty

hlasů
58

Pokud se mi podařilo najít a ověřit existenci souboru pomocí Server.MapPath a teď chci poslat uživateli přímo do tohoto souboru, co je nejrychlejší způsob, jak převést tento absolutní cestu zpět do relativní webové cesty?

Položena 06/08/2008 v 09:34
zdroj uživatelem
V jiných jazycích...                            


6 odpovědí

hlasů
49

Možná, že by to mohlo fungovat:

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

Já používám c #, ale mohl by být přizpůsobeny VB.

Odpovězeno 06/08/2008 v 10:28
zdroj uživatelem

hlasů
34

Nebylo by hezké mít Server.RelativePath (cesta) ?

No, stačí ji prodloužit ;-)

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

Díky tomu můžete jednoduše zavolat

Server.RelativePath(path, Request);
Odpovězeno 07/03/2011 v 18:27
zdroj uživatelem

hlasů
12

Vím, že je to starý, ale potřeboval jsem, aby účet pro virtuální adresáře (za @ Costo v komentáři). Zdá se, že pomůže:

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.");
}
Odpovězeno 05/05/2012 v 15:05
zdroj uživatelem

hlasů
4

Líbí se mi myšlenka z Canoas. Bohužel jsem neměl „HttpContext.Current.Request“ k dispozici (BundleConfig.cs).

Změnil jsem Metoda takto:

public static string RelativePath(this HttpServerUtility srv, string path)
{
     return path.Replace(HttpContext.Current.Server.MapPath("~/"), "~/").Replace(@"\", "/");
}
Odpovězeno 24/06/2015 v 08:19
zdroj uživatelem

hlasů
2

Pokud jste použili Server.MapPath, pak byste měli již mít relativní webový cestu. Podle dokumentace MSDN , tato metoda vezme jednu proměnnou, cestu , která je virtuální cestu k serveru. Takže pokud jste byli schopni volat metodu, měli byste už mít relativní web cesta okamžitě přístupné.

Odpovězeno 06/08/2008 v 09:44
zdroj uživatelem

hlasů
0

Pro ASP.NET jádra i napsal pomocnou třídu získat stezky v obou směrech.

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");
    }

od kontrolora nebo službu aplikovat FilePathHelper a využití:

var physicalPath = _fp.GetPhysicalPath("/img/banners/abro.png");

a naopak

var virtualPath = _fp.GetVirtualPath(physicalPath);
Odpovězeno 19/12/2018 v 11:40
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more