47 votes

Comment convertir un chemin de fichier en URL dans 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 assigner une URL à 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;
        }
    }
 

16voto

Dementic Points 3288

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

14voto

Fredrik Kalseth Points 6633

Afaik, il n'y a aucune méthode pour faire ce que vous voulez directement. Je stockais le photosLocation en tant que chemin relatif à l'application; f.ex. "~ / 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 HttpContext.Current.Request.ResolveUrl(filenameRelative);
    }
}
 

11voto

Ross Presser Points 1074

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
 

Alors:

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

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

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

car il n’existe aucun moyen d’obtenir une liste complète des répertoires virtuels.

9voto

Andy Rose Points 7987

J'ai accepté Fredriks, car il semble que le problème soit résolu avec le moins d'effort possible, mais l'objet Request ne semble pas contenir la méthode ResolveUrl. Vous pouvez y accéder via l'objet Page ou un objet de contrôle Image:

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

Une alternative, si vous utilisez une classe statique telle que je suis, consiste à utiliser VirtualPathUtility:

 myImage.ImageUrl = VirtualPathUtility.ToAbsolute(photoURL);
 

3voto

Biri Points 4992

Peut-être que ce n'est pas le meilleur moyen, mais il 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;

Edit: Ok, quelqu'un marqué comme non utile. Quelques explications: prendre le chemin physique de la page en cours, de le diviser en deux parties: le serveur et le répertoire (comme c:\inetpub\whatever.com\whatever) et le nom de la page (comme /que ce soit.aspx). L'image du chemin d'accès physique doit contenir le chemin d'accès du serveur, afin de "soustraire", laissant seulement l'image du chemin d'accès relatif au serveur (comme: \design\picture.jpg). Remplacer les barres obliques inverses avec des barres obliques et les ajouter à l'url du serveur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X