c# - Absoluter Weg zurück ins Web

Translate

Wenn es mir gelungen ist, das Vorhandensein einer Datei mithilfe von Server.MapPath zu finden und zu überprüfen, und ich den Benutzer jetzt direkt an diese Datei senden möchte, wie lautet die?am schnellstenMöglichkeit, diesen absoluten Pfad wieder in einen relativen Webpfad umzuwandeln?

This question and all comments follow the "Attribution Required."

Alle Antworten

Translate

Vielleicht könnte das funktionieren:

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

Ich benutze c #, könnte aber an vb angepasst werden.

Quelle
Translate

Wäre es nicht schön zu habenServer.RelativePath (Pfad)?

Nun, du musst es nur erweitern ;-)

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

Damit können Sie einfach anrufen

Server.RelativePath(path, Request);
Quelle
Translate

Ich weiß, dass dies alt ist, aber ich musste virtuelle Verzeichnisse berücksichtigen (gemäß @ Costos Kommentar). Dies scheint zu helfen:

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

Ich mag die Idee von Canoas. Leider war "HttpContext.Current.Request" nicht verfügbar (BundleConfig.cs).

Ich habe die Methode folgendermaßen geändert:

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

Wenn Sie Server.MapPath verwendet haben, sollten Sie bereits über den relativen Webpfad verfügen. Laut demMSDN-Dokumentationnimmt diese Methode eine Variable,PfadDies ist der virtuelle Pfad des Webservers. Wenn Sie also die Methode aufrufen konnten, sollte der relative Webpfad bereits sofort verfügbar sein.

Quelle
Translate

Für asp.net core habe ich eine Hilfsklasse geschrieben, um Pfade in beide Richtungen zu erhalten.

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

Injizieren Sie vom Controller oder Service FilePathHelper und verwenden Sie:

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

und umgekehrt

var virtualPath = _fp.GetVirtualPath(physicalPath);
Quelle