Frage

Im Grunde habe ich einige code zu überprüfen, ein bestimmtes Verzeichnis zu finden, wenn ein Bild da ist, und wenn, so möchte ich eine URL zuzuweisen, um das Bild auf eine 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;
    }
}
War es hilfreich?

Lösung

Soweit ich weiß, gibt es keine Methode, das zu tun, was Sie wollen;zumindest nicht direkt.Ich würde speichern photosLocation als relativen Pfad zu der Anwendung;zum Beispiel: "~/Images/".Diese Weise, Sie könnte verwenden MapPath um den physischen Speicherort, und ResolveUrl zum abrufen der URL (mit ein bisschen Hilfe von 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);
    }
}

Andere Tipps

dies ist, was ich benutze:

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

Das problem mit all diesen Antworten ist, dass Sie nicht virtuellen Verzeichnisse in Betracht.

Beachten:

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

Also:

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

Aber es gibt keine Weg, dies zu tun:

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

weil es keine Möglichkeit gibt, eine vollständige Liste der virtuellen Verzeichnisse.

Ich habe akzeptiert, Fredriks beantworten, als es scheint, das problem zu lösen mit den wenigsten Aufwand, aber das Request-Objekt nicht angezeigt werden conatin die ResolveUrl Methode.Diese kann aufgerufen werden, durch das Page-Objekt oder ein Image-Steuerelement-Objekt:

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

Eine alternative, wenn Sie über eine statische Klasse, wie ich bin, ist die Verwendung der VirtualPathUtility:

myImage.ImageUrl = VirtualPathUtility.ToAbsolute(photoURL);

Vielleicht ist dies nicht der beste Weg, aber es funktioniert.

// 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, jemand markiert als nicht hilfreich.Einige Erklärung:nehmen Sie den physischen Pfad der aktuellen Seite, spaltete es sich in zwei Teile:server und Verzeichnis (wie c:\inetpub\whatever.com\whatever) und der name der Seite (wie /Was auch immer.aspx).Das Bild der physischen Pfad enthalten sollte, die server-Pfad, also "subtrahieren", damit nur das Bild der relativen Pfad auf dem server (wie:\design\picture.jpg).Ersetzen Sie die backslashes durch slashes und hängen Sie an der server-url.

Dies funktionierte für mich:

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

So weit ich weiß, gibt es keine einzige Funktion, die dies tut (vielleicht waren Sie auf der Suche für die inverse von MapPath?).Ich würde gerne wissen, ob eine solche Funktion existiert.Bis dahin, würde ich einfach den Dateinamen(s) zurückgegeben GetFiles, entfernen Sie den Pfad, und stellen Sie die URL root.Dies kann getan werden, generisch.

Die einfache Lösung scheint es zu sein, haben einen temporären Speicherort innerhalb der website, die Sie zugreifen können leicht mit URL und dann können Sie Dateien verschieben, um den physischen Speicherort, wenn Sie Sie brauchen, um Sie zu speichern.

Für das linke Teil des URLs:

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

Für die Anwendung (web -) name:

?HttpRuntime.AppDomainAppVirtualPath
"/"

Mit diesem, Sie sind verfügbar, um Ihre relativen Pfad nach Erhalt der vollständigen URL.

Ich denke, das sollte funktionieren.Könnte es sein, ab auf die Schrägstriche.Nicht sicher, ob Sie gebraucht werden oder nicht.

string url = Request.ApplicationPath + "/" + photosLocation + "/" + files[0];
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top