caminho absoluto de volta ao caminho web-relativo

votos
58

Se eu consegui localizar e verificar a existência de um arquivo usando Server.MapPath e agora quer enviar o usuário diretamente para o arquivo, o que é o mais rápido maneira de converter esse caminho absoluto de volta em um caminho web parente?

Publicado 06/08/2008 em 09:34
fonte usuário
Em outras línguas...                            


6 respostas

votos
49

Talvez isso pode funcionar:

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

Eu estou usando c #, mas pode ser adaptado para VB.

Respondeu 06/08/2008 em 10:28
fonte usuário

votos
34

Não seria bom ter Server.RelativePath (caminho) ?

bem, você apenas precisa de estendê-lo ;-)

public static class ExtensionMethods
{
    public static string RelativePath(this HttpServerUtility srv, string path, HttpRequest context)
    {
        return path.Replace(context.ServerVariables["APPL_PHYSICAL_PATH"], "~/").Replace(@"\", "/");
    }
}

Com isso, você pode simplesmente chamar

Server.RelativePath(path, Request);
Respondeu 07/03/2011 em 18:27
fonte usuário

votos
12

Eu sei que isto é antiga, mas eu precisava para dar conta de diretórios virtuais (por @ o comentário de Costo). Isso parece ajudar:

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.");
}
Respondeu 05/05/2012 em 15:05
fonte usuário

votos
4

Eu gosto da idéia de Canoas. Infelizmente eu não tinha "HttpContext.Current.Request" disponíveis (BundleConfig.cs).

Mudei o methode assim:

public static string RelativePath(this HttpServerUtility srv, string path)
{
     return path.Replace(HttpContext.Current.Server.MapPath("~/"), "~/").Replace(@"\", "/");
}
Respondeu 24/06/2015 em 08:19
fonte usuário

votos
2

Se você usou Server.MapPath, então você já deve ter o caminho web relativa. De acordo com a documentação MSDN , este método leva uma variável, caminho , que é o caminho virtual do servidor Web. Então, se você fosse capaz de chamar o método, você já deve ter o caminho web relativa imediatamente acessível.

Respondeu 06/08/2008 em 09:44
fonte usuário

votos
0

Para núcleo asp.net i escreveu classe auxiliar para obter pathes em ambas as direções.

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

do controlador ou serviço injetar FilePathHelper e uso:

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

e versa

var virtualPath = _fp.GetVirtualPath(physicalPath);
Respondeu 19/12/2018 em 11:40
fonte usuário

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