2008-08-06 45 views
56

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 fácil de convertir ? esa ruta absoluta volver a una ruta web relativa?Ruta absoluta de regreso a la ruta relativa a la web

+5

Esta pregunta es de dos años, la capacidad para enviar comentarios no existía en aquel entonces. "GEEZ". – tags2k

Respuesta

47

Tal vez esto podría funcionar:

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

(estoy usando C#, pero podría adaptarse a vb)

(@ Tags2k: Tengo editted la respuesta anterior)

+0

Esto solo funciona dentro del contexto de una solicitud. – bzlm

+2

@ [GateKiller] (http://stackoverflow.com/questions/3164?sort=oldest#3218): tenga en cuenta que si utiliza los directorios virtuales de IIS en su sitio web, su solución puede fallar porque la ruta física de la aplicación puede ser diferente de la ruta física del archivo. – Costo

2

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

+0

Esto no es necesariamente cierto - la llamada MapPath podría haber sido realizada por otro método y pasado a/llamada de mi método de archivo corrector, o (en mi caso) construido a partir de una serie de elementos diferentes, uno de los cuales es mi directorio de recursos (definido como "~/__ Recursos"). Obviamente, dirigir al usuario a este camino va a generar resultados inesperados. También sería útil saber esto porque a veces la ruta absoluta del archivo podría haberse retirado de la base de datos sin otra información contextual. – tags2k

+0

[@tagsk] (http://stackoverflow.com/questions/3164#3195) - No sé nada de eso. Por cierto que el método está definido, si la cadena que ingresa en Server.MapPath es válida y devuelve una ruta de acceso física al servidor, esta debe haber sido también una ruta virtual válida, independientemente de cómo la haya generado. En cuanto al uso de la tilde (~) al comienzo de una dirección virtual, consulte este artículo de MSDN en [ASP.NET Web Site Paths] (http://msdn.microsoft.com/en-us/library/ms178116.aspx) :> ASP.NET incluye la aplicación web > operador de raíz (~), que se puede utilizar > al especificar una ruta de acceso en el servidor > c –

+2

Yaakov - No es así. Por ejemplo, una función que uso toma una ruta raíz y devuelve una colección 'IEnumerable ' recursivamente. En mi aplicación web, puedo proporcionar esta ruta que resuelve mi ruta relativa a una ruta física, pero cuando recupero esta lista recursiva y quiero volver a asignarla a rutas relativas en mi aplicación, no tengo esa información. –

33

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

bien, 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); 
+3

un mejor reemplazo para la ruta física sería ~ /. path.Replace (context.ServerVariables ("APPL_PHYSICAL_PATH"), "~ /") –

11

Sé que esto es viejo, pero que necesitaba para dar cuenta de los directorios virtuales (por El comentario de @ Costo). 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."); 
} 
4

Me gusta la idea de Canoas. Lamentablemente, no tenía disponible "HttpContext.Current.Request" (BundleConfig.cs).

me cambiaron la méthode de esta manera:

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