Program Tip

웹 상대 경로로 돌아가는 절대 경로

programtip 2020. 11. 24. 19:25
반응형

웹 상대 경로로 돌아가는 절대 경로


Server.MapPath를 사용하여 파일의 존재를 찾아서 확인하고 이제 사용자를 해당 파일로 직접 보내려는 경우 절대 경로를 상대 웹 경로로 다시 변환하는 가장 빠른 방법 은 무엇 입니까?


아마도 이것이 작동 할 수 있습니다.

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

나는 C #을 사용하고 있지만 vb에 적응할 수 있습니다.


Server.RelativePath (path) 가 있으면 좋지 않습니까?

글쎄, 당신은 그것을 확장해야합니다 ;-)

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

이것으로 당신은 단순히 전화 할 수 있습니다

Server.RelativePath(path, Request);

나는 이것이 오래되었다는 것을 알고 있지만 가상 디렉토리를 고려해야했습니다 (@Costo의 의견에 따라). 이것은 도움이 될 것 같습니다.

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

Canoas의 아이디어가 마음에 듭니다. 불행히도 "HttpContext.Current.Request"를 사용할 수 없습니다 (BundleConfig.cs).

다음과 같이 방법을 변경했습니다.

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

Server.MapPath를 사용한 경우 이미 상대 웹 경로가 있어야합니다. MSDN 설명서 에 따르면 이 메서드는 웹 서버의 가상 경로 인 path 하나의 변수를 사용 합니다. 따라서 메서드를 호출 할 수 있다면 즉시 액세스 할 수있는 상대 웹 경로가 이미 있어야합니다.


asp.net 코어의 경우 양방향으로 경로를 얻기 위해 도우미 클래스를 작성했습니다.

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

컨트롤러 또는 서비스에서 FilePathHelper를 주입하고 다음을 사용하십시오.

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

그리고 반대

var virtualPath = _fp.GetVirtualPath(physicalPath);

참고 URL : https://stackoverflow.com/questions/3164/absolute-path-back-to-web-relative-path

반응형