Question

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

Était-ce utile?

La solution

Peut-être cela peut fonctionner:

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

Je suis à l'aide de c# mais pourrait être adapté à vb.

Autres conseils

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

eh bien, vous avez juste besoin de la prolonger ;-)

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

Je sais que c'est vieux, mais j'avais besoin de compte pour les répertoires virtuels (par @Costo commentaire).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.");
}

J'aime l'idée de Canoas.Malheureusement je n'avais pas "HttpContext.Actuel.La demande" sont disponibles (BundleConfig.cs).

J'ai changé la methode comme ceci:

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

Si vous avez utilisé le Serveur.MapPath, alors vous devriez déjà avoir la relative chemin web.Selon l' La documentation MSDN, cette méthode met une variable, chemin, qui est le chemin d'accès virtuel du serveur Web.Donc, si vous êtes en mesure d'appeler la méthode, vous devriez déjà avoir la relative web de chemin d'accès, immédiatement accessible.

Pour asp.net de base, j'ai écrit de la classe helper pour obtenir les chemins dans les deux directions.

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

de Contrôleur ou d'un service injecter FilePathHelper et d'utilisation:

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

et versa

var virtualPath = _fp.GetVirtualPath(physicalPath);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top