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;
    }
}
Was dit nuttig?

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];
Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top