2016-04-27 8 views
2

Ich versuche, eine Bild-Sitemap für meine Website zu erstellen. So wie ich dies tue, lade ich für jede Seite der Sitemap die Seite und analysiere alle Bild-Tags im HTML. Hier ein kurzer Auszug:Sitecore: Wie kann ich eine Medienbibliothek per URL erhalten?

var htmlImgTags = doc.DocumentNode.SelectNodes("//img[@src]"); 
if (htmlImgTags != null) 
    return 
     htmlImgTags.Select(htmlImg => host + htmlImg.Attributes["src"].Value.Split('?').First()) 
          .ToList(); 

So habe ich die URL für jedes Bild, aber ich brauche die Medienbibliothek Artikel mit ihm verbunden zu bekommen (so, dass ich den Bildnamen und andere Bereiche zu bekommen). Eine Beispiel-URL, die ich erhalte, ist https://mysite/~/media/MySiteImages/MediaImage.ashx

Hier ist, wie ich versuche, die Bild zu bekommen:

var db = Sitecore.Data.Database.GetDatabase("web"); 
var imageItem = db.GetItem(imageUrl); 

Ich habe versucht, in /media/MySiteImages/MediaImage.ashx gerade vorbei, /mysite/~/media/MySiteImages/MediaImage.ashx und andere Variationen der URL, aber alles null zurück

Antwort

4

Hier ist der Code, der den Trick tun sollten:

public Item GetMediaItem(string localPath) 
    { 
     int indexA = -1; 
     string strB = string.Empty; 
     string str1 = MainUtil.DecodeName(localPath); 
     foreach (string str2 in MediaManager.Provider.Config.MediaPrefixes.Select(MainUtil.DecodeName)) 
     { 
      indexA = str1.IndexOf(str2, StringComparison.InvariantCultureIgnoreCase); 
      if (indexA >= 0) 
      { 
       strB = str2; 
       break; 
      } 
     } 
     if (indexA < 0 || string.Compare(str1, indexA, strB, 0, strB.Length, true, CultureInfo.InvariantCulture) != 0) 
      return null; 
     string id = StringUtil.Divide(StringUtil.Mid(str1, indexA + strB.Length), '.', true)[0]; 
     if (id.EndsWith("/", StringComparison.InvariantCulture)) 
      return null; 
     Database database = Sitecore.Context.Database; 
     if (ShortID.IsShortID(id)) 
      return database.GetItem(ShortID.Decode(id)); 
     string path = "/sitecore/media library/" + id.TrimStart('/'); 
     var mediaItem = database.GetItem(path); 
     if (mediaItem != null) 
     { 
      return mediaItem; 
     } 
     Item root = database.GetItem("/sitecore/media library"); 
     if (root != null) 
     { 
      Item item = new ItemPathResolver().ResolveItem(StringUtil.Divide(StringUtil.Mid(localPath, indexA + strB.Length), '.', true)[0], root); 
      if (item != null) 
       return item; 
     } 
     return null; 
    } 
public class ItemPathResolver 
{ 
    public virtual Item ResolveItem(string path, Item root) 
    { 
     return DoResolveItem(path.Split(new char[1] 
     { 
      '/' 
     }, StringSplitOptions.RemoveEmptyEntries).ToList(), root); 
    } 

    protected virtual Item DoResolveItem(List<string> pathParts, Item root) 
    { 
     if (!pathParts.Any() || root == null) 
      return root; 
     string str = pathParts.First(); 
     List<string> range = pathParts.GetRange(1, pathParts.Count - 1); 
     Item child1 = GetChild(root, str); 
     Item obj = DoResolveItem(range, child1); 
     if (obj == null) 
     { 
      string itemName = MainUtil.DecodeName(str); 
      if (str != itemName) 
      { 
       Item child2 = GetChild(root, itemName); 
       obj = DoResolveItem(range, child2); 
      } 
     } 
     return obj; 
    } 

    protected virtual Item GetChild(Item item, string itemName) 
    { 
     foreach (Item obj in item.Children) 
     { 
      if (obj.Name.Equals(itemName, StringComparison.InvariantCultureIgnoreCase)) 
       return obj; 
     } 
     return null; 
    } 
} 
+0

Wo haben Sie Suche von ItemPathResolver? Es ist nicht in meinem Projekt erkannt, muss ich etwas installieren? –

+0

Es befindet sich in 'Sitecore.Kernel.dll' im' Sitecore.Data.ItemResolvers'-Namespace. Ich benutze Sitecore 8.1. Wenn Sie eine alte Version von Sitecore verwenden, habe ich den Code dieser Klasse in meine Antwort eingefügt, damit Sie sie verwenden können. –

+0

Eurgh. Ich weiß, das liegt nicht an dir, aber Sitecore hat den 'GetMediaPath()' Code an die falsche Stelle gesetzt, hätte diesen Code viel einfacher gemacht, wenn die Methode veröffentlicht wurde. +1 trotzdem. – jammykam

0

Es gibt dynamic Klasse, die Ihre Aufgabe lösen könnte:

string src = "your url"; 
DynamicLink dynamicLink; 
if (DynamicLink.TryParse(src, out dynamicLink)) 
{ 
    var itemId = dynamicLink.ItemId; 
} 

dyna micLink Variable enthält ItemId, mit der Sie Artikel erhalten können.

0

Versuchen Sie es mit dem/sitecore-Knoten. /sitecore/media/MySiteImages/MediaImage.ashx

Verwandte Themen