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;
    }
}
45
demandé sur Hooked 2008-08-19 15:24:55

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);
    }
}
13
répondu Fredrik Kalseth 2016-01-20 05:39:05

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(@"\", "/"));
 }
11
répondu Dementic 2012-10-15 14:17:50

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.

11
répondu Ross Presser 2013-06-05 14:15:52

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);
8
répondu Andy Rose 2008-08-19 13:51:26

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.

3
répondu Biri 2008-08-19 12:25:38

Cela a fonctionné pour moi:

HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority) + HttpRuntime.AppDomainAppVirtualPath + "ImageName";
1
répondu NxtWhat 2012-01-24 11:10:00

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.

0
répondu 2008-08-19 11:53:30

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.

0
répondu fireydude 2011-07-29 11:40:10

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.

0
répondu adripanico 2012-11-19 11:12:07

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];
-2
répondu Robin Robinson 2013-08-25 20:25:03