Domanda

Fondamentalmente ho del codice per controllare una directory specifica per vedere se è presente un'immagine e, in tal caso, voglio assegnare un URL all'immagine a un 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;
    }
}
È stato utile?

Soluzione

Per quanto ne so, non esiste un metodo per fare quello che vuoi;almeno non direttamente.Conserverei il photosLocation come percorso relativo all'applicazione;Per esempio: "~/Images/".In questo modo, potresti utilizzare MapPath per ottenere la posizione fisica e ResolveUrl per ottenere l'URL (con un po' di aiuto da 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);
    }
}

Altri suggerimenti

questo è quello che uso:

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

Il problema con tutte queste risposte è che non tengono conto delle directory virtuali.

Prendere in considerazione:

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

COSÌ:

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

Ma c'è NO modo per farlo:

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

perché non è possibile ottenere un elenco completo delle directory virtuali.

Ho accettato la risposta di Fredriks poiché sembra risolvere il problema con il minimo sforzo, tuttavia l'oggetto Request non sembra contenere il metodo ResolveUrl.È possibile accedervi tramite l'oggetto Pagina o un oggetto controllo Immagine:

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

Un'alternativa, se stai usando una classe statica come me, è usare VirtualPathUtility:

myImage.ImageUrl = VirtualPathUtility.ToAbsolute(photoURL);

Forse questo non è il modo migliore, ma funziona.

// 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;

Modificare:Ok, qualcuno contrassegnato come non utile.Qualche spiegazione:prendi il percorso fisico della pagina corrente, dividilo in due parti:server e directory (come c:\inetpub\qualunque cosa.com\qualunque cosa) e nome della pagina (come /qualunque cosa.aspx).Il percorso fisico dell'immagine dovrebbe contenere il percorso del server, quindi "sottraili", lasciando solo il percorso dell'immagine relativo a quello del server (come:\disegno\immagine.jpg).Sostituisci le barre rovesciate con barre e aggiungile all'URL del server.

Questo ha funzionato per me:

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

Per quanto ne so, non esiste un'unica funzione che faccia questo (forse stavi cercando l'inverso di MapPath?).Mi piacerebbe sapere se esiste una funzione del genere.Fino ad allora, prenderei semplicemente i nomi file restituiti da GetFiles, rimuoverei il percorso e anteporrei la radice dell'URL.Questo può essere fatto in modo generico.

La soluzione semplice sembra essere quella di avere una posizione temporanea all'interno del sito Web a cui è possibile accedere facilmente con l'URL e quindi spostare i file nella posizione fisica quando è necessario salvarli.

Per ottenere la parte sinistra dell'URL:

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

Per ottenere il nome dell'applicazione (web):

?HttpRuntime.AppDomainAppVirtualPath
"/"

Con questo, sei disponibile ad aggiungere il tuo percorso relativo dopo aver ottenuto l'URL completo.

Penso che questo dovrebbe funzionare.Potrebbe essere fuori dalle barre.Non sono sicuro se siano necessari o meno.

string url = Request.ApplicationPath + "/" + photosLocation + "/" + files[0];
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top