Absolute pad terug naar web-relatief pad

stemmen
58

Als ik erin geslaagd te vinden en verificatie van het bestaan van een bestand met behulp van Server.MapPath en ik wil nu aan de gebruiker direct naar dat bestand te sturen, wat is de snelste manier om dat absolute pad terug te zetten in een relatief web pad?

De vraag is gesteld op 06/08/2008 om 09:34
bron van user
In andere talen...                            


6 antwoorden

stemmen
49

Misschien is dit zou kunnen werken:

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

Ik ben met behulp van C #, maar kan worden aangepast aan vb.

antwoordde op 06/08/2008 om 10:28
bron van user

stemmen
34

Zou het niet leuk zijn om te hebben Server.RelativePath (pad) ?

goed, je hoeft alleen maar om het uit te breiden ;-)

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

Met deze kun je gewoon bellen

Server.RelativePath(path, Request);
antwoordde op 07/03/2011 om 18:27
bron van user

stemmen
12

Ik weet dat dit is oud, maar ik nodig om rekening te houden met virtuele mappen (per @ Costo's commentaar). Dit lijkt te helpen:

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.");
}
antwoordde op 05/05/2012 om 15:05
bron van user

stemmen
4

Ik hou van het idee van Canoas. Helaas had ik niet "HttpContext.Current.Request" beschikbaar (BundleConfig.cs).

Ik veranderde de methode als volgt uit:

public static string RelativePath(this HttpServerUtility srv, string path)
{
     return path.Replace(HttpContext.Current.Server.MapPath("~/"), "~/").Replace(@"\", "/");
}
antwoordde op 24/06/2015 om 08:19
bron van user

stemmen
2

Als u Server.MapPath gebruikt, dan moet je al over de relatieve web pad. Volgens de MSDN documentatie Deze werkwijze duurt een variabele pad , die het virtuele pad van de webserver. Dus als je in staat om de methode te bellen waren, moet je al het relatieve web pad direct toegankelijk.

antwoordde op 06/08/2008 om 09:44
bron van user

stemmen
0

Voor asp.net kern schreef ik helper klasse Pathes in beide richtingen te krijgen.

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

van Controller of dienst te injecteren FilePathHelper en gebruik:

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

en versa

var virtualPath = _fp.GetVirtualPath(physicalPath);
antwoordde op 19/12/2018 om 11:40
bron van user

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