2008-08-06 10 views
56

Si j'ai réussi à localiser et vérifier l'existence d'un fichier en utilisant Server.MapPath et que je veux maintenant envoyer l'utilisateur directement à ce fichier, quel est le le plus rapide moyen de convertir ce chemin absolu dans un chemin Web relatif?Chemin absolu retour au chemin Web

+5

Cette question est de deux ans, la possibilité de poster des commentaires n'existait pas à l'époque. "GEEZ". – tags2k

Répondre

47

Peut-être que cela pourrait fonctionner:

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

(j'utilise C#, mais pourrait être adapté à v)

(@ Tags2k: J'ai editted la réponse ci-dessus)

+0

Cela ne fonctionne que dans le contexte d'une demande. – bzlm

+2

@ [GateKiller] (http://stackoverflow.com/questions/3164?sort=oldest#3218): Notez que si vous utilisez des répertoires virtuels IIS sur votre site Web, votre solution peut échouer car le chemin physique de l'application peut être différent de le chemin physique du fichier. – Costo

2

Si vous utilisiez Server.MapPath, vous devriez déjà avoir le chemin Web relatif. Selon le MSDN documentation, cette méthode prend une variable, le chemin, qui est le chemin virtuel du serveur Web. Donc, si vous étiez en mesure d'appeler la méthode, vous devriez déjà avoir le chemin Web relatif immédiatement accessible.

+0

Ce n'est pas nécessairement vrai - l'appel MapPath aurait pu être effectué par une autre méthode et passé dans/appelé depuis ma méthode de vérification de fichier, ou (dans mon cas) construit à partir de plusieurs éléments, dont mon répertoire de ressources (défini comme "~/__ Resources"). Évidemment, diriger l'utilisateur vers ce chemin va entraîner des résultats inattendus. Il serait également utile de le savoir car, parfois, le chemin du fichier absolu peut avoir été retiré de la base de données sans aucune autre information contextuelle. – tags2k

+0

[@tagsk] (http://stackoverflow.com/questions/3164#3195) - Je ne sais pas à ce sujet. Par la manière dont la méthode est définie, si la chaîne que vous entrez dans Server.MapPath est valide et renvoie un chemin de serveur physique, cela doit également être un chemin virtuel valide, quelle que soit la manière dont vous l'avez généré. En ce qui concerne l'utilisation du tilde (~) au début d'une adresse virtuelle, consultez cet article MSDN sur [chemins d'accès au site Web ASP.NET] (http://msdn.microsoft.com/en-us/library/ms178116.aspx) :> ASP.NET inclut l'application Web > l'opérateur racine (~), que vous pouvez utiliser > lors de la spécification d'un chemin dans le serveur > c –

+2

Yaakov - Pas si. Par exemple, une fonction que j'utilise prend un chemin racine et renvoie une collection 'IEnumerable ' de manière récursive. Dans mon application Web, je peux fournir ce chemin en résolvant mon chemin relatif vers un chemin physique, mais quand je récupère cette liste récursive et que je veux la reconfigurer sur des chemins relatifs dans mon application, je n'ai pas cette information. –

33

Ne serait-il pas agréable d'avoir Server.RelativePath (chemin)?

bien, il vous suffit de l'étendre ;-)

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

Avec cela, vous pouvez simplement appeler

Server.RelativePath(path, Request); 
+3

un meilleur remplacement pour le chemin physique serait ~ /. path.Replace (context.ServerVariables ("APPL_PHYSICAL_PATH"), "~ /") –

11

Je sais que c'est vieux, mais je devais tenir compte des répertoires virtuels (par Commentaire de @ Costo). Cela semble aider:

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

J'aime l'idée de Canoas. Malheureusement, je n'ai pas "HttpContext.Current.Request" disponible (BundleConfig.cs).

J'ai changé les Methode comme ceci:

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