c# - Retour absolu sur le Web

Translate

Si j'ai réussi à localiser et à vérifier l'existence d'un fichier à l'aide de Server.MapPath et que je veux maintenant envoyer l'utilisateur directement vers ce fichier, quel est lele plus rapidemoyen de convertir ce chemin absolu en un chemin Web relatif?

This question and all comments follow the "Attribution Required."

Toutes les réponses

Translate

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.

La source
Translate

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

bon, 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);
La source
Translate

Je sais que c'est vieux mais j'avais besoin de tenir compte des répertoires virtuels (par le 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.");
}
La source
Translate

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(@"\", "/");
}
La source
Translate

Si vous avez utilisé Server.MapPath, vous devriez déjà avoir le chemin Web relatif. Selon leDocumentation MSDN, cette méthode prend une variable,chemin, qui est le chemin virtuel du serveur Web. Donc, si vous pouviez appeler la méthode, vous devriez déjà avoir le chemin Web relatif immédiatement accessible.

La source
Translate

Pour asp.net core, j'ai écrit une classe d'assistance pour obtenir des chemins 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");
    }

à partir du contrôleur ou du service, injectez FilePathHelper et utilisez:

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

et versa

var virtualPath = _fp.GetVirtualPath(physicalPath);
La source