Bezwzględna ścieżka z powrotem do internetowego względnej ścieżki

głosy
58

Jeśli udało mi się zlokalizować i zweryfikować istnienie pliku przy użyciu Server.MapPath i teraz chce wysłać użytkownikowi bezpośrednio do tego pliku, co jest najszybszym sposobem przekonwertować ścieżkę bezwzględną powrotem na ścieżkę względną internetowej?

Utwórz 06/08/2008 o 09:34
źródło użytkownik
W innych językach...                            


6 odpowiedzi

głosy
49

Być może to działa:

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

Używam C #, ale może być dostosowany do VB.

Odpowiedział 06/08/2008 o 10:28
źródło użytkownik

głosy
34

Czy nie byłoby miło mieć Server.RelativePath (path) ?

Cóż, po prostu trzeba go rozszerzyć ;-)

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

Z tego można po prostu zadzwonić

Server.RelativePath(path, Request);
Odpowiedział 07/03/2011 o 18:27
źródło użytkownik

głosy
12

Wiem, że to stary, ale ja potrzebowałem stanowią wirtualnych katalogów (na @ komentarzu Całkowity użytkownika). To wydaje się pomóc:

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.");
}
Odpowiedział 05/05/2012 o 15:05
źródło użytkownik

głosy
4

Podoba mi się pomysł z Canoas. Niestety nie miałem „HttpContext.Current.Request” Dostępny (BundleConfig.cs).

Zmieniłem methode tak:

public static string RelativePath(this HttpServerUtility srv, string path)
{
     return path.Replace(HttpContext.Current.Server.MapPath("~/"), "~/").Replace(@"\", "/");
}
Odpowiedział 24/06/2015 o 08:19
źródło użytkownik

głosy
2

Jeśli użyto Server.MapPath, to należy już ścieżkę względną internetowej. Według dokumentacji MSDN , ta metoda ma jedną zmienną, ścieżkę , która jest wirtualną ścieżkę do serwera WWW. Więc jeśli były w stanie wywołać metodę, trzeba mieć już względna ścieżka internetowej natychmiast dostępne.

Odpowiedział 06/08/2008 o 09:44
źródło użytkownik

głosy
0

Dla rdzenia ASP.NET i napisał klasy pomocnika dostać Ścieżki edukacyjne w obu kierunkach.

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

z kontrolerem lub usługi wstrzyknąć FilePathHelper i zastosowanie:

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

i versa

var virtualPath = _fp.GetVirtualPath(physicalPath);
Odpowiedział 19/12/2018 o 11:40
źródło użytkownik

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