Pregunta

Básicamente tengo algo de código para comprobar un directorio específico para ver si una imagen es la que hay y si es así quiero asignar una dirección URL a la imagen de 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;
    }
}
¿Fue útil?

Solución

Que yo sepa, no hay ningún método para hacer lo que usted desea;al menos no directamente.Me gustaría almacenar el photosLocation como una ruta de acceso relativa a la aplicación;por ejemplo: "~/Images/".De esta manera, se podría utilizar 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);
    }
}

Otros consejos

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(@"\", "/"));
 }

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

Considere la posibilidad de:

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 no forma de hacerlo:

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

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

He aceptado Fredriks respuesta como aparece a solucionar el problema con la menor cantidad de esfuerzo, sin embargo el objeto de Petición no parece conatin la ResolveUrl método.Se puede acceder a este a través de la Página de objeto o una Imagen en el objeto de control:

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

Una alternativa, si usted está utilizando una clase estática como soy, es el uso de la VirtualPathUtility:

myImage.ImageUrl = VirtualPathUtility.ToAbsolute(photoURL);

Tal vez esta no es la mejor forma, 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 marcados como no útil.Explicación:tome la ruta de acceso física de la página actual, dividido en dos partes:servidor y el directorio (como c:\inetpub\whatever.com\whatever) y el nombre de la página (como /Lo que sea.aspx).La imagen de la ruta de acceso física debe contener el servidor de la ruta, por lo que "restar", dejando sólo la ruta de la imagen en relación a la del servidor (como por ejemplo:\design\picture.jpg).Reemplazar las barras con barras y anexar a la dirección url del servidor.

Esto funcionó para mí:

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

Que yo sepa, no hay una única función que hace esto (tal vez estás buscando el inverso de MapPath?).Me gustaría saber si dicha función existe.Hasta entonces, sólo quiero tomar el nombre de archivo(s) devueltos por GetFiles, retire el camino, y poner la URL de la raíz.Esto se puede hacer de forma genérica.

La solución más simple parece ser la de tener una ubicación temporal dentro de la página web que se puede acceder fácilmente con la dirección URL y, a continuación, puede mover los archivos a la ubicación física cuando usted necesita para salvarlos.

Para obtener la parte izquierda de la URL:

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

Para obtener la aplicación (web) nombre:

?HttpRuntime.AppDomainAppVirtualPath
"/"

Con esto, usted está disponible para agregar la ruta de acceso relativa después de que la obtención de la dirección URL completa.

Creo que esto debería funcionar.Podría estar fuera de las barras.No está seguro de si son necesarias o no.

string url = Request.ApplicationPath + "/" + photosLocation + "/" + files[0];
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top