66 votes

Chemin absolu vers le chemin relatif au web

Si j'ai réussi à localiser et à vérifier l'existence d'un fichier à l'aide de Server.MapPath et que je souhaite maintenant envoyer l'utilisateur directement vers ce fichier, quelle est la procédure à suivre ? le plus rapide un moyen de reconvertir ce chemin absolu en un chemin web relatif ?

56voto

GateKiller Points 19113

Peut-être que cela pourrait fonctionner :

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

J'utilise c# mais pourrait être adapté à vb.

2 votes

@ GateKiller : Notez que si vous utilisez des répertoires virtuels IIS dans votre site Web, votre solution peut échouer car le chemin physique de l'application peut être différent du chemin physique du fichier.

38voto

Canoas Points 321

Ce ne serait pas bien d'avoir Server.RelativePath(path) ?

Eh bien, il 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 votes

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

13voto

AlexCuse Points 9823

Je sais que c'est vieux, mais j'avais besoin de tenir compte des répertoires virtuels (selon le commentaire de @Costo). Ceci semble m'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.");
}

5voto

Pierre Chavaroche Points 381

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

J'ai changé la méthode comme ceci :

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

2voto

Yaakov Ellis Points 15470

Si vous avez utilisé Server.MapPath, vous devriez déjà disposer du chemin web relatif. Selon le Documentation MSDN cette méthode ne prend qu'une seule variable, chemin qui est le chemin virtuel du serveur Web. Ainsi, si vous avez pu appeler la méthode, vous devriez déjà avoir le chemin Web relatif immédiatement accessible.

0 votes

Ce n'est pas nécessairement vrai - l'appel à MapPath pourrait avoir été effectué par une autre méthode et passé dans / appelé par ma méthode de vérification de fichiers, ou (dans mon cas) construit à partir d'un certain nombre d'éléments différents, dont l'un est mon répertoire de ressources (défini comme "~/__Resources"). Il est évident que le fait de diriger l'utilisateur vers ce chemin va donner des résultats inattendus. Il serait également utile de le savoir, car parfois le chemin d'accès absolu au fichier peut avoir été extrait de la base de données sans autre information contextuelle.

0 votes

@tagsk - Je n'en sais rien. De la manière dont la méthode est définie, si la chaîne de caractères que vous entrez dans Server.MapPath est valide et renvoie un chemin d'accès physique au serveur, alors ce chemin d'accès virtuel devait également être valide, indépendamment de 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 aux sites Web ASP.NET : > ASP.NET comprend l'opérateur racine (~) de l'application Web, que vous pouvez utiliser > lorsque vous spécifiez un chemin d'accès dans le > c serveur.

2 votes

Yaakov - Pas vraiment. Par exemple, une fonction que j'utilise prend un chemin Root et renvoie un chemin IEnumerable<FileInfo> de manière récursive. Dans mon application web, je peux fournir ce chemin en résolvant mon chemin relatif en un chemin physique, mais lorsque je récupère cette liste récursive et que je veux les mapper en chemins relatifs dans mon application, je n'ai pas cette information.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X