2016-04-27 169 views
2

我正在尝试为我的网站构建一个图像站点地图。我这样做的方式是针对站点地图中的每个页面,我加载页面并解析出HTML中的所有图像标记。这里有一个简短的片断:Sitecore:如何通过URL获取媒体库项目?

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

所以我必须为每个图像的URL,但我需要得到与它相关的媒体库项目(这样我就可以得到图像名称等领域)。我得到的一个例子URL是https://mysite/~/media/MySiteImages/MediaImage.ashx

这里是如何我试图让图片:

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

我试图通过在短短/media/MySiteImages/MediaImage.ashx/mysite/~/media/MySiteImages/MediaImage.ashx,并在URL其他变化,但一切都返回null

回答

4

这是应该做的伎俩代码:

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

你从哪里得到ItemPathResolver?它在我的项目中不被认可,我是否需要安装某些东西? –

+0

它位于Sitecore.Data.ItemResolvers命名空间中的'Sitecore.Kernel.dll'中。我正在使用Sitecore 8.1。如果您使用旧版本的Sitecore,我已将该类的代码粘贴到我的答案中,以便您可以使用它。 –

+0

Eurgh。我知道这不是你的,但Sitecore把'GetMediaPath()'代码放在错误的地方,如果这个方法被公开了,会让这个代码变得更简单。 +1。 – jammykam

0

有可能解决您的任务DynamicLink类:

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

DYNA micLink变量将包含ItemId,通过它您将能够获取项目。

0

尝试从/ sitecore节点开始。 /sitecore/media/MySiteImages/MediaImage.ashx