2008-08-19 28 views
42

Básicamente tengo un código para verificar un directorio específico para ver si hay una imagen y, si es así, quiero asignar una URL a la imagen a un ImageControl.Cómo convierto una ruta de archivo a una URL en ASP.NET

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

Respuesta

13

Hasta donde yo sé, no hay ningún método para hacer lo que quiera; al menos no directamente. Guardaría el photosLocation como una ruta relativa a la aplicación; por ejemplo: "~/Images/". De esta manera, se puede usar MapPath para obtener la ubicación física, y ResolveUrl para obtener la URL (con un poco de ayuda de 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); 
    } 
} 
+8

No encuentro el miembro ResolveUrl de HttpRequest en la documentación de ninguna de las versiones de .Net. ¿Estás usando ASP.Net MVC? – Jared

+12

@Fredrik Como Jared ha señalado el objeto HttpRequest no tiene este método. Se puede encontrar en el objeto Página o en un objeto de control web. ¿Podrías editar tu respuesta para reflejar esto? –

+7

'ResolveUrl' no es miembro de' System.Web.HttpRequest' – adripanico

0

Por lo que yo sé que no hay una sola función que hace esto (tal vez buscaba la inversa de MapPath?). Me encantaría saber si existe tal función. Hasta entonces, simplemente tomaría los nombres de archivo devueltos por GetFiles, eliminaría la ruta y anteponería el URL raíz. Esto puede hacerse genéricamente.

-2

Creo que esto debería funcionar. Puede estar apagado en las barras. No estoy seguro si son necesarios o no.

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

Tal vez esto no es la mejor manera, pero funciona.

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

Editar: Ok, alguien marcado como no útil. Algunas explicaciones: tome la ruta física de la página actual, divídala en dos partes: servidor y directorio (como c: \ inetpub \ whatever.com \ whatever) y nombre de la página (como /Whatever.aspx). La ruta física de la imagen debe contener la ruta del servidor, así que "restarla", dejando solo la ruta de la imagen relativa a la del servidor (como: \ design \ picture.jpg). Reemplace las barras diagonales con barras y añádalas a la url del servidor.

8

He aceptado la respuesta de Fredriks, ya que parece que resuelve el problema con la menor cantidad de esfuerzo, sin embargo, el objeto Request no concuerda con el método ResolveUrl. Esto se puede acceder a través del objeto de página o un objeto de control de archivo:

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

Una alternativa, si está utilizando una clase estática como soy, es utilizar el VirtualPathUtility:

myImage.ImageUrl = VirtualPathUtility.ToAbsolute(photoURL); 
0

El La solución simple parece ser tener una ubicación temporal dentro del sitio web a la que pueda acceder fácilmente con URL y luego puede mover los archivos a la ubicación física cuando necesite guardarlos.

1

Esto funcionó para mí:

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

esto es lo que yo uso:

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

Gracias por esto, aquí está como un método de extensión en 'Server' -' cadena estática pública MapUrl (este Servidor HttpServerUtilityBase, ruta de cadena) ' – B2K

10

El problema con todas estas respuestas es que no se toman en cuenta los directorios virtuales.

considerar:

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 

Así:

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

pero hay sin manera de hacer esto:

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

porque no hay manera de obtener una lista completa de directorios virtuales.

0

Para llegar a la parte izquierda de la URL:

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

Para obtener el nombre de la aplicación (web):

?HttpRuntime.AppDomainAppVirtualPath 
"/" 

Con esto, están disponibles para agregar su ruta relativa después de que la obtención de la URL completa.

Cuestiones relacionadas