programing

ASP.NET에서 파일 경로를 URL로 변환하는 방법

copysource 2023. 8. 23. 23:38
반응형

ASP.NET에서 파일 경로를 URL로 변환하는 방법

기본적으로 특정 디렉터리를 확인하여 이미지가 있는지 확인하고 이미지에 대한 URL을 ImageControl에 할당하고자 합니다.

if (System.IO.Directory.Exists(photosLocation))
{
    string[] files = System.IO.Directory.GetFiles(photosLocation, "*.jpg");
    if (files.Length > 0)
    {
        // TODO: return the url of the first file found;
    }
}

이것이 제가 사용하는 것입니다.

private string MapURL(string path)
{
    string appPath = Server.MapPath("/").ToLower();
    return string.Format("/{0}", path.ToLower().Replace(appPath, "").Replace(@"\", "/"));
 }

제가 아는 한, 당신이 원하는 것을 할 수 있는 방법은 없습니다; 적어도 직접적으로는 아닙니다.저장할 것입니다.photosLocation응용 프로그램에 대한 경로로, 예:"~/Images/"이렇게 하면 MapPath를 사용하여 실제 위치를 가져올 수 있습니다.ResolveUrlURL을 얻다 (로부터 약간의 도움을 받아)System.IO.Path):

string photosLocationPath = HttpContext.Current.Server.MapPath(photosLocation);
if (Directory.Exists(photosLocationPath))
{
    string[] files = Directory.GetFiles(photosLocationPath, "*.jpg");
    if (files.Length > 0)
    {
        string filenameRelative = photosLocation +  Path.GetFilename(files[0])   
        return Page.ResolveUrl(filenameRelative);
    }
}

이러한 모든 답변의 문제는 가상 디렉터리를 고려하지 않는다는 것입니다.

고려 사항:

Site named "tempuri.com/" rooted at c:\domains\site
virtual directory "~/files" at c:\data\files
virtual directory "~/files/vip" at c:\data\VIPcust\files

그래서:

Server.MapPath("~/files/vip/readme.txt") 
  = "c:\data\VIPcust\files\readme.txt"

그러나 이를 수행할 방법은 없습니다.

MagicResolve("c:\data\VIPcust\files\readme.txt") 
   = "http://tempuri.com/files/vip/readme.txt"

전체 가상 디렉터리 목록을 가져올 방법이 없기 때문입니다.

저는 Fredriks의 답변을 수락했습니다. 최소의 노력으로 문제를 해결하는 것처럼 보이지만 Request 개체에 ResolveUrl 메서드가 포함되어 있지 않은 것처럼 보이기 때문입니다.페이지 개체 또는 이미지 제어 개체를 통해 액세스할 수 있습니다.

myImage.ImageUrl = Page.ResolveUrl(photoURL);
myImage.ImageUrl = myImage.ResolveUrl(photoURL);

나처럼 정적 클래스를 사용하는 경우 VirtualPath Utility를 사용할 수 있습니다.

myImage.ImageUrl = VirtualPathUtility.ToAbsolute(photoURL);

이것은 저에게 효과가 있었습니다.

HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority) + HttpRuntime.AppDomainAppVirtualPath + "ImageName";

이것이 최선의 방법은 아닐 수도 있지만, 효과가 있습니다.

// Here is your path
String p = photosLocation + "whatever.jpg";

// Here is the page address
String pa = Page.Request.Url.AbsoluteUri;

// Take the page name    
String pn = Page.Request.Url.LocalPath;

// Here is the server address    
String sa = pa.Replace(pn, "");

// Take the physical location of the page    
String pl = Page.Request.PhysicalPath;

// Replace the backslash with slash in your path    
pl = pl.Replace("\\", "/");    
p = p.Replace("\\", "/");

// Root path     
String rp = pl.Replace(pn, "");

// Take out same path    
String final = p.Replace(rp, "");

// So your picture's address is    
String path = sa + final;

편집: 네, 도움이 안 된다고 표시된 사람이 있습니다.몇 가지 설명: 현재 페이지의 물리적 경로를 사용하여 서버와 디렉터리(예: c:\inetpub\whatever.com \http)와 페이지 이름(예: /Whating.aspx)의 두 부분으로 분할합니다.이미지의 물리적 경로는 서버의 경로를 포함해야 하므로 서버의 경로에 상대적인 이미지의 경로만 남겨두면서 서버의 경로를 "감산"해야 합니다(예: \design\picture.jpg).백슬래시를 슬래시로 바꾸고 서버의 URL에 추가합니다.

제가 알기로는 이를 수행하는 단일 함수는 없습니다(아마도 MapPath의 역방향을 찾고 있었을 것입니다).그런 기능이 있는지 알고 싶습니다.그 전까지는 GetFiles에서 반환한 파일 이름을 가져와서 경로를 제거하고 URL 루트 앞에 추가했습니다.이 작업은 일반적으로 수행할 수 있습니다.

간단한 해결책은 웹 사이트 내에 URL로 쉽게 액세스할 수 있는 임시 위치를 둔 다음 저장해야 할 때 파일을 실제 위치로 이동할 수 있습니다.

URL의 왼쪽 부분을 잊어버립니다.

?HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority)
"http://localhost:1714"

응용 프로그램(웹) 이름을 잊어버림:

?HttpRuntime.AppDomainAppVirtualPath
"/"

이렇게 하면 전체 URL을 얻은 후 상대 경로를 추가할 수 있습니다.

이게 통해야 할 것 같아요.슬래시가 벗겨질 수도 있습니다.그것들이 필요한지 아닌지 확실하지 않습니다.

string url = Request.ApplicationPath + "/" + photosLocation + "/" + files[0];

언급URL : https://stackoverflow.com/questions/16007/how-do-i-convert-a-file-path-to-a-url-in-asp-net

반응형