Question

Fondamentalement, j'ai du code pour vérifier un répertoire spécifique pour voir si une image s'y trouve et si c'est le cas, je souhaite attribuer 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;
    }
}
Était-ce utile?

La solution

Autant que je sache, il n'existe aucune méthode pour faire ce que vous voulez ;du moins pas directement.je stockerais le photosLocation comme 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);
    }
}

Autres conseils

voici 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 Non façon de procéder :

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.

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 contenir la méthode ResolveUrl.Ceci est accessible 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 comme moi, consiste à utiliser VirtualPathUtility :

myImage.ImageUrl = VirtualPathUtility.ToAbsolute(photoURL);

Ce n'est peut-être pas la meilleure solution, 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, quelqu'un a été marqué comme inutile.Quelques explications :prenez le chemin physique de la page en cours, divisez-la en deux parties :serveur et répertoire (comme c:\inetpub\whatever.com\whatever) et nom de la page (comme /Whatever.aspx).Le chemin physique de l'image doit contenir le chemin du serveur, donc "soustrayez-les", ne laissant que le chemin de l'image par rapport à celui du serveur (comme :\design\image.jpg).Remplacez les barres obliques inverses par des barres obliques et ajoutez-les à 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'existe pas une seule fonction qui fasse cela (peut-être cherchiez-vous l'inverse de Chemin de la carte?).J'aimerais savoir si une telle fonction existe.Jusque-là, je prendrais simplement le(s) nom(s) de fichier renvoyé par GetFiles, supprimerais le chemin et ajouterais la racine de l'URL.Cela peut être fait de manière générique.

La solution simple semble être d'avoir un emplacement temporaire sur le site Web auquel vous pouvez accéder facilement avec une URL, puis de déplacer les fichiers vers l'emplacement physique lorsque vous devez les enregistrer.

Pour obtenir la partie gauche de l'URL :

?HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority)
"http://localhost:1714"

Pour obtenir le nom de l'application (Web) :

?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.C'est peut-être faux sur les barres obliques.Je ne sais pas s'ils sont nécessaires ou non.

string url = Request.ApplicationPath + "/" + photosLocation + "/" + files[0];
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top