Ruta absoluta hacia la ruta relativa a la web

votos
58

Si he logrado localizar y verificar la existencia de un archivo usando Server.MapPath y ahora quiero enviar al usuario directamente a ese archivo, ¿cuál es la forma más rápida de convertir esa ruta absoluta nuevamente en una ruta web relativa?

Publicado el 06/08/2008 a las 09:34
fuente por usuario
En otros idiomas...                            


6 respuestas

votos
49

Quizás esto podría funcionar:

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

Estoy usando c # pero podría ser adaptado a vb.

Respondida el 06/08/2008 a las 10:28
fuente por usuario

votos
34

¿No sería bueno tener Server.RelativePath (ruta) ?

así, sólo tiene que extenderlo ;-)

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 esto se puede llamar simplemente

Server.RelativePath(path, Request);
Respondida el 07/03/2011 a las 18:27
fuente por usuario

votos
12

Sé que esto es viejo, pero que necesitaba para dar cuenta de los directorios virtuales (por @ comentario de Coste). Esto parece ayudar:

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.");
}
Respondida el 05/05/2012 a las 15:05
fuente por usuario

votos
4

Me gusta la idea de Canoas. Por desgracia he tenido no "HttpContext.Current.Request" disponibles (BundleConfig.cs).

He cambiado la méthode de esta manera:

public static string RelativePath(this HttpServerUtility srv, string path)
{
     return path.Replace(HttpContext.Current.Server.MapPath("~/"), "~/").Replace(@"\", "/");
}
Respondida el 24/06/2015 a las 08:19
fuente por usuario

votos
2

Si usó Server.MapPath, entonces ya debería tener la ruta web relativa. De acuerdo con la documentación de MSDN , este método toma una variable, ruta , que es la ruta virtual del servidor web. Entonces, si fue capaz de llamar al método, ya debería tener acceso inmediato a la ruta web relativa.

Respondida el 06/08/2008 a las 09:44
fuente por usuario

votos
0

Para el núcleo asp.net que escribí clase de ayuda para obtener pathes en ambas direcciones.

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

de Controller o servicio inyectar FilePathHelper y uso:

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

y versa

var virtualPath = _fp.GetVirtualPath(physicalPath);
Respondida el 19/12/2018 a las 11:40
fuente por usuario

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