Chemin d'accès absolu vers le web chemin relatif
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?
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);