Comment convertir un chemin de fichier en URL en ASP.NET
Fondamentalement, j'ai un code pour vérifier un répertoire spécifique pour voir si une image est là, et si oui, je veux attribuer une URL de l'image à 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;
}
}
10 réponses
autant Que je sache, il n'y a pas de méthode pour faire ce que vous voulez; au moins, pas directement. J'avais store photosLocation
comme un chemin d'accès relatif à l'application; par exemple: "~/Images/"
. De cette façon, vous pouvez utiliser MapPath pour obtenir l'emplacement physique, et ResolveUrl
pour obtenir l'URL (avec un peu d'aide 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);
}
}
c'est ce que j'utilise:
private string MapURL(string path)
{
string appPath = Server.MapPath("/").ToLower();
return string.Format("/{0}", path.ToLower().Replace(appPath, "").Replace(@"\", "/"));
}
le problème avec toutes ces réponses est qu'elles ne prennent pas en compte les répertoires virtuels.
Considérer:
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
Donc:
Server.MapPath("~/files/vip/readme.txt")
= "c:\data\VIPcust\files\readme.txt"
Mais il y a aucun manière de faire ceci:
MagicResolve("c:\data\VIPcust\files\readme.txt")
= "http://tempuri.com/files/vip/readme.txt"
parce qu'il n'y a aucun moyen pour obtenir une liste complète des répertoires virtuels.
J'ai accepté la réponse de Fredriks car elle semble résoudre le problème avec le moins d'effort possible mais l'objet Request ne semble pas conatinuer la méthode ResolveUrl. On peut y accéder par l'intermédiaire de L'objet Page ou d'un objet de contrôle D'Image:
myImage.ImageUrl = Page.ResolveUrl(photoURL);
myImage.ImageUrl = myImage.ResolveUrl(photoURL);
Une alternative, si vous utilisez une classe statique comme je suis, est d'utiliser le VirtualPathUtility:
myImage.ImageUrl = VirtualPathUtility.ToAbsolute(photoURL);
peut-être que ce n'est pas la meilleure façon, mais ça marche.
// 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, quelqu'un marqué comme non utile. Quelques explications: prendre le chemin physique de la page courante, le diviser en deux parties: serveur et répertoire (comme c:\inetpub\whatever.com\whatever) et le nom de la page (like /Whatever.aspx). Le chemin physique de l'image doit contenir le chemin du serveur, donc "les soustraire", en ne laissant que le chemin de l'image par rapport à celui du serveur (comme: \design\picture.jpg). Remplacer les barres obliques avec slashes et ajoutez - le à l'url du serveur.
Cela a fonctionné pour moi:
HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority) + HttpRuntime.AppDomainAppVirtualPath + "ImageName";
pour autant que je sache, il n'y a pas de fonction unique qui fait cela (peut-être que vous cherchiez l'inverse de MapPath?). J'aimerais savoir si une telle fonction existe. En attendant, je prendrais simplement le(S) nom (s) de fichier retourné (s) par GetFiles, supprimerais le chemin, et préparerais la racine de L'URL. Cela peut être fait de façon générique.
la solution simple semble être d'avoir un emplacement temporaire dans le site Web que vous pouvez accéder facilement avec L'URL et ensuite vous pouvez déplacer des fichiers à l'emplacement physique quand vous avez besoin de les sauver.
Pour obtenir la partie gauche de l'URL:
?HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority)
"http://localhost:1714"
Pour obtenir l'application (web) nom:
?HttpRuntime.AppDomainAppVirtualPath
"/"
avec cela, vous êtes disponible pour ajouter votre chemin relatif après avoir obtenu L'URL complète.
je pense que cela devrait fonctionner. Il peut être désactivé sur les barres obliques. Vous ne savez pas si elles sont nécessaires ou pas.
string url = Request.ApplicationPath + "/" + photosLocation + "/" + files[0];