2008-08-19 10 views
42

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 à l'ImageControl.Comment convertir un chemin de fichier en URL dans 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; 
    } 
} 

Répondre

13

Pour autant que je sache, il n'y a pas de méthode pour faire ce que vous voulez; au moins pas directement. Je stocker le photosLocation en tant que chemin 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); 
    } 
} 
+8

Je ne trouve pas le membre ResolveUrl de HttpRequest dans la documentation de l'une des versions .Net. Utilisez-vous ASP.Net MVC? – Jared

+12

@Fredrik Comme Jared a souligné que l'objet HttpRequest n'a pas cette méthode. Il peut être trouvé dans l'objet Page ou un objet de contrôle Web. Pourriez-vous éditer votre réponse pour refléter cela? –

+7

'ResolveUrl' n'est pas membre de' System.Web.HttpRequest' – adripanico

0

Pour autant que je sais qu'il n'y a pas une seule fonction qui le fait (peut-être vous recherchez l'inverse de MapPath?). J'aimerais savoir si une telle fonction existe. Jusque-là, je prendrais juste le (s) nom (s) de fichier retourné par GetFiles, enlèverais le chemin, et préfixerais la racine d'URL. Cela peut être fait de manière générique.

-2

Je pense que cela devrait fonctionner. Il pourrait être éteint sur les barres obliques. Je ne sais pas si elles sont nécessaires ou non.

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

Peut-être que ce n'est pas la meilleure façon, mais cela fonctionne.

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

Modifier: Ok, une personne marquée comme n'étant pas utile. Quelques explications: prenez le chemin physique de la page en cours, divisez-le en deux parties: serveur et répertoire (comme c: \ inetpub \ whatever.com \ whatever) et nom de page (comme /Whatever.aspx). Le chemin physique de l'image doit contenir le chemin du serveur, donc "soustrayez"-le, ne laissant que le chemin de l'image par rapport au serveur (comme: \ design \ picture.jpg). Remplacez les barres obliques inversées par des barres obliques et ajoutez-le à l'URL du serveur.

8

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 conatiner la méthode ResolveUrl. Cela peut être consulté à travers l'objet Page ou un objet de contrôle de l'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); 
0

Le solution simple semble être d'avoir un emplacement temporaire dans le site Web que vous pouvez accéder facilement avec l'URL, puis vous pouvez déplacer des fichiers à l'emplacement physique lorsque vous avez besoin de les enregistrer.

1

Cela a fonctionné pour moi:

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

ce que j'utilise:

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

Merci pour cela, voici comme une méthode d'extension sur 'Server' -' chaîne statique publique MapUrl (ce serveur HttpServerUtilityBase, chemin de chaîne) ' – B2K

10

Le problème avec toutes ces réponses est qu'ils ne prennent pas des répertoires virtuels en compte.

Tenir compte:

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 

Alors:

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

Mais il n'y a aucun moyen de le faire:

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

parce qu'il n'y a pas moyen d'obtenir une liste complète des répertoires virtuels.

0

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 l'obtention l'URL complète

Questions connexes