mvc - ¿Cómo convierto una ruta de archivo a una URL en ASP.NET?
imageurl asp net c# (10)
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];
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.
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;
}
}
El problema con todas estas respuestas es que no tienen 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
Asi que:
Server.MapPath("~/files/vip/readme.txt")
= "c:/data/VIPcust/files/readme.txt"
Pero no hay forma de hacer esto:
MagicResolve("c:/data/VIPcust/files/readme.txt")
= "http://tempuri.com/files/vip/readme.txt"
porque no hay forma de obtener una lista completa de directorios virtuales.
Esto funcionó para mí:
HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority) + HttpRuntime.AppDomainAppVirtualPath + "ImageName";
Hasta donde yo sé, no hay un método para hacer lo que quieres; al menos no directamente. Almacenaba la photosLocation
las photosLocation
como una ruta relativa a la aplicación; por ejemplo: "~/Images/"
. De esta forma, 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);
}
}
He aceptado la respuesta de Fredriks, ya que parece resolver el problema con la menor cantidad de esfuerzo, sin embargo, parece que el objeto Request no concuerda con el método ResolveUrl. Se puede acceder a esto a través del objeto de Página o un objeto de control de Imagen:
myImage.ImageUrl = Page.ResolveUrl(photoURL);
myImage.ImageUrl = myImage.ResolveUrl(photoURL);
Una alternativa, si está usando una clase estática tal como soy, es usar VirtualPathUtility:
myImage.ImageUrl = VirtualPathUtility.ToAbsolute(photoURL);
La solución simple parece ser tener una ubicación temporal dentro del sitio web a la que pueda acceder fácilmente con la URL y luego puede mover los archivos a la ubicación física cuando necesite guardarlos.
Para obtener 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á disponible para agregar su ruta relativa luego de obtener la URL completa.
Por lo que sé, no hay una sola función que lo haga (¿quizás estabas buscando 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.
Quizás esta no sea 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 marcó 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.
esto es lo que uso:
private string MapURL(string path)
{
string appPath = Server.MapPath("/").ToLower();
return string.Format("/{0}", path.ToLower().Replace(appPath, "").Replace(@"/", "/"));
}