웹 상대 경로로 돌아가는 절대 경로
서버를 사용하여 파일의 존재를 찾고 확인할 수 있는 경우.이제 MapPath와 사용자를 해당 파일로 직접 보내려고 하는데, 절대 경로를 다시 상대적인 웹 경로로 변환하는 가장 빠른 방법은 무엇입니까?
아마도 이것은 효과가 있을 것입니다.
String RelativePath = AbsolutePath.Replace(Request.ServerVariables["APPL_PHYSICAL_PATH"], String.Empty);
나는 c#을 사용하고 있지만 vb에 적응할 수 있습니다.
서버가 있으면 좋지 않을까요?상대 경로(경로)?
음, 그냥 연장하면 됩니다 ;-)
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.");
}
카노아스의 아이디어가 마음에 듭니다.불행하게도 저는 "HttpContext"가 없었습니다.현재의.요청"(BundleConfig.cs )을 사용할 수 있습니다.
메서드를 다음과 같이 변경했습니다.
public static string RelativePath(this HttpServerUtility srv, string path)
{
return path.Replace(HttpContext.Current.Server.MapPath("~/"), "~/").Replace(@"\", "/");
}
서버를 사용한 경우.MapPath, 그러면 이미 상대적인 웹 경로가 있어야 합니다.MSDN 문서에 따르면 이 방법은 웹 서버의 가상 경로인 하나의 변수 경로를 사용합니다.따라서 메소드를 호출할 수 있었다면 이미 관련 웹 경로에 즉시 액세스할 수 있어야 합니다.
asp.net core의 경우 양방향 경로를 얻기 위해 도우미 클래스를 작성했습니다.
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
'programing' 카테고리의 다른 글
데이터 그리드 보기에서 셀 강조 표시 사용 안 함 (0) | 2023.07.07 |
---|---|
SqlPlus SP2-0734: 오류 (0) | 2023.07.07 |
Visual Studio 2017 - 치명적인 오류로 Git 실패 (0) | 2023.07.07 |
작성자에게 최소 파일을 설치하도록 지시하는 방법 (0) | 2023.07.07 |
개체를 저장할 때 SpringBoot JPA@CreatedDate@LastModifiedDate가 채워지지 않음 (0) | 2023.07.07 |