Hoe kan ek 'n pad van die lêer om te skakel na 'n URL in ASP.NET
Vra
Eintlik het ek het 'n paar kode vir 'n spesifieke gids om te sien of 'n beeld is daar en indien wel ek wil 'n URL na die beeld toewys aan 'n 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;
}
}
Oplossing
Sover ek weet, is daar geen manier om te doen wat jy wil; ten minste nie direk. Ek sal die photosLocation
as 'n pad met betrekking tot die aansoek stoor; byvoorbeeld: "~/Images/"
. Op hierdie manier, kan jy MapPath gebruik om die fisiese plek te kry, en ResolveUrl
om die URL te kry (met 'n bietjie hulp van 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);
}
}
Ander wenke
Dit is wat ek gebruik:
private string MapURL(string path)
{
string appPath = Server.MapPath("/").ToLower();
return string.Format("/{0}", path.ToLower().Replace(appPath, "").Replace(@"\", "/"));
}
Die probleem met al hierdie antwoorde is dat hulle nie virtuele dopgehou in ag neem.
Oorweeg:
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
So:
Server.MapPath("~/files/vip/readme.txt")
= "c:\data\VIPcust\files\readme.txt"
Maar daar is geen manier om dit te doen:
MagicResolve("c:\data\VIPcust\files\readme.txt")
= "http://tempuri.com/files/vip/readme.txt"
want daar is geen manier om 'n volledige lys van virtuele dopgehou kry.
Ek het Fredriks antwoord aanvaar as dit lyk of die probleem op te los met die minste hoeveelheid moeite egter die voorwerp Versoek blyk nie die ResolveUrl metode conatin. Dit kan verkry word deur middel van die Page voorwerp of 'n Image beheer voorwerp:
myImage.ImageUrl = Page.ResolveUrl(photoURL);
myImage.ImageUrl = myImage.ResolveUrl(photoURL);
'n alternatiewe, as jy 'n statiese klas soos ek, is om die VirtualPathUtility gebruik:
myImage.ImageUrl = VirtualPathUtility.ToAbsolute(photoURL);
Miskien is dit nie die beste manier, maar dit werk.
// 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;
Edit: Ok, iemand gemerk as nie nuttig. 'N verduideliking: neem die fisiese pad van die huidige bladsy, verdeel dit in twee dele: bediener en gids (soos c: \ Inetpub \ whatever.com \ ookal) en bladsy name (soos /Whatever.aspx). Die beeld se fisiese pad moet pad die bediener se bevat, so "aftrek" hulle, sodat net die beeld se pad met betrekking tot die bediener se (soos: \ ontwerp \ Picture.jpg). Vervang die skuinsstrepe met houe en voeg dit by url die bediener se.
Dit werk vir my:
HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority) + HttpRuntime.AppDomainAppVirtualPath + "ImageName";
So ver as wat ek weet daar is nie 'n enkele funksie wat dit doen (miskien het jy is op soek na die inverse van MapPath ?). Ek sou graag wou weet of so 'n funksie bestaan. Tot dan, sal ek net die lêernaam (s) teruggekeer deur GetFiles, verwyder die pad, en prefix die URL wortel. Dit kan generies gedoen.
Die eenvoudige oplossing blyk te wees om 'n tydelike plek binne die webwerf wat jy maklik kan bekom met URL het en dan kan jy lêers na die fisiese ligging beweeg wanneer jy dit nodig om hulle te red.
Vir kry die linker deel van die URL:
?HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority)
"http://localhost:1714"
Vir kry die naam aansoek (web):
?HttpRuntime.AppDomainAppVirtualPath
"/"
Met hierdie, jy is beskikbaar om jou relatiewe pad voeg daarna die verkryging van die volledige URL.
Ek dink dit behoort te werk. Dit kan wees af op die houe. Nie seker of hulle nie nodig het of nie.
string url = Request.ApplicationPath + "/" + photosLocation + "/" + files[0];