Domanda

Se sono riuscito a individuare e verificare l'esistenza di un file tramite Server.MapPath e ora voglio inviare l'utente direttamente al file, qual è il più veloce modo per convertire il percorso assoluto in una relativa percorso web?

È stato utile?

Soluzione

Forse questo potrebbe funzionare:

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

Sto usando c# ma potrebbe essere adattato per vb.

Altri suggerimenti

Non sarebbe bello avere Server.RelativePath(percorso)?

bene, hai solo bisogno di estendere la pena ;-)

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

Con questo si può chiamare semplicemente

Server.RelativePath(path, Request);

So che questo è vecchio, ma ho bisogno di account per le directory virtuali (per @Costo del commento).Questo sembra aiutare:

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

Mi piace l'idea da Canoas.Purtroppo non ho avuto la "HttpContext.Corrente.Richiesta" disponibili (BundleConfig.cs).

Ho cambiato la methode come questo:

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

Se hai utilizzato il Server.MapPath, allora si dovrebbe già avere il relativo percorso web.Secondo il La documentazione MSDN, questo metodo prende una variabile, percorso, che è il percorso virtuale del Web server.Quindi, se siete stati in grado di chiamare il metodo, si dovrebbe già avere il relativo percorso web immediatamente accessibili.

Per asp.net core ho scritto classe helper per ottenere percorsi in entrambe le direzioni.

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

da Controller o servizio iniettare FilePathHelper e utilizzare:

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

e viceversa

var virtualPath = _fp.GetVirtualPath(physicalPath);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top