chemin absolu retour à chemin relatif web

voix
58

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

Créé 06/08/2008 à 09:34
source utilisateur
Dans d'autres langues...                            


6 réponses

voix
49

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.

Créé 06/08/2008 à 10:28
source utilisateur

voix
34

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);
Créé 07/03/2011 à 18:27
source utilisateur

voix
12

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.");
}
Créé 05/05/2012 à 15:05
source utilisateur

voix
4

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

J'ai changé le Methode comme ceci:

public static string RelativePath(this HttpServerUtility srv, string path)
{
     return path.Replace(HttpContext.Current.Server.MapPath("~/"), "~/").Replace(@"\", "/");
}
Créé 24/06/2015 à 08:19
source utilisateur

voix
2

Si vous avez utilisé Server.MapPath, alors vous devriez déjà avoir le chemin web relatif. Selon la documentation MSDN , cette méthode prend une variable, 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.

Créé 06/08/2008 à 09:44
source utilisateur

voix
0

Pour noyau asp.net j'ai écrit classe d'aide pour obtenir pathes dans les deux sens.

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

du contrôleur ou service injecter FilePathHelper et de l'utilisation:

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

et versa

var virtualPath = _fp.GetVirtualPath(physicalPath);
Créé 19/12/2018 à 11:40
source utilisateur

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