【问题标题】:Sitecore How to get the value inside the field 'Media' of a Media ItemSitecore 如何获取媒体项的“媒体”字段内的值
【发布时间】:2015-11-04 14:33:13
【问题描述】:

更新 2: 我仍在努力争取在服务器上保存图标。

我在做什么:

Item item = Sitecore.Context.Database.GetItem(imageId);
var imageIconUrl = Sitecore.Resources.Images.GetThemedImageSource(item.Appearance.Icon, ImageDimension.id32x32);

if (!string.IsNullOrEmpty(imageIconUrl))
{
  // download the icon from the url 
  var iconFullPath = "e:\\pngIcons\\excelIcon.png"; 
  var webClient = new System.Net.WebClient();
  var downloadPath = "http://serverName/" + imageIconUrl;
  webClient.DownloadFile(downloadPath, iconFullPath);
}

变量downloadPath 包含以下字符串:

http://serverName/sitecore/shell/themes/standard/~/media/E503BA48C89B422D8400393F1C7086A7.ashx?h=32&thn=1&w=32&db=master

最后我看到的是一个 png 文件,但里面什么都没有。我还复制了我在变量downloadPath 中得到的字符串并将其粘贴到浏览器中,我可以看到如下图标:

请让我知道我做错了什么。 或者如何保存图标。谢谢!!

原问题:

sitecore 媒体项目有一个字段“Media”。我说的是这个:

我想访问这个字段。原因是:

如果我使用例如访问它item.GetMediaStream() 然后我会得到完整的文件。我只是想在服务器上保存这个小图标。是否可以 ?

【问题讨论】:

    标签: sitecore sitecore7.2


    【解决方案1】:

    要获取图标/缩略图,您可以使用

    var icon = Sitecore.Resources.Media.MediaManager.GetThumbnailUrl(mediaItem);
    

    获取缩略图的url。

    如果你想要缩略图流,你需要使用MediaData 对象。像这样:

    var mediaItem = new MediaItem(item)
    var mediaData = new MediaData(mediaItem);
    var iconStream = mediaData.GetThumbnailStream();
    if (iconStream.Length < 0) 
    {
        // The stream is empty, its probably a file that Sitecore can't 
        // generate a thumbnail for. Just use the Icon
        var icon = item.Appearance.Icon;
    }
    

    这将获得附加到媒体项目的实际媒体 blob 的图标或缩略图。如果您只想要 Sitecore 项目的图标,则使用 Martins 方法。

    如果流为空,Sitecore 无法为其生成缩略图,因此您可以只使用媒体项模板的图标文件。 item.Appearance.Icon

    【讨论】:

    • 但是在上述情况下,我将如何在服务器上保存iconStream。我的意思是说System.IO流我可以使用.CopyTo(path)然后保存流。
    • 是的,我通过var stream = iconStream.Stream;得到它
    • 很抱歉打扰您,但如果文件不是图像文件,则使用此方法保存文件是不成功的。文件大小为 0 KB。例如在 Excel 文件中。
    • 我认为这是因为您拥有的文件没有生成的缩略图,因此 Sitecore 将只使用与媒体类型关联的图标,在本例中为 Excel 文件。所以你可以只使用 items 图标属性。我已经更新了答案以反映这一点。如果流为空,马丁斯的回答也将起作用。
    • 嗨,对不起,但我仍在努力找出如何从图标下载流。如果您知道,请告诉我如何将此var icon = item.Appearance.Icon; 保存为服务器上的图像。
    【解决方案2】:

    外观部分(标准模板)有一个名为Icon的字段 - 您可以在此处修改项目的图标。还有一个名为 Thumbnail 的字段 - 你的 excel 图标就在那里

    您可以通过编程方式访问该字段,请注意它以两个下划线开头:__Icon:

    var iconField = item.Fields["__Icon"];
    var thumbnailField = item.Fields["__Thumbnail"];
    

    更新:正如您所问,以下是将任一字段保存到驱动器文件中的代码。我已经测试了代码并确认成功将缩略图字段中的图标存储到文件中:

    string mediaItemPath = "/sitecore/media library/Files/ExcelFile";
    string mediaFiedlName = "Thumbnail"; // also can be "__Icon"
    
    var item = Sitecore.Context.Database.GetItem(mediaItemPath);
    
    var iconField = item.Fields[mediaFiedlName];
    if (iconField.HasBlobStream)
    {
      var thumb = (ImageField)iconField;
    
      var bl = ((MediaItem)thumb.MediaItem).InnerItem.Fields["blob"];
      Stream stream = bl.GetBlobStream();
    
      byte[] buffer = new byte[8192];
      using (FileStream fs = File.Create("D:\\you_file_name.ico")) // change your path
      {
        int length;
        do
        {
          length = stream.Read(buffer, 0, buffer.Length);
          fs.Write(buffer, 0, length);
        }
        while (length > 0);
    
        fs.Flush();
        fs.Close();
      }
    }
    

    更新 2: 如果这没有帮助,那么我建议查看该图标是如何在 Sitecore 的 Media 字段中生成的。在最坏的情况下,您可以执行以下操作 - 右键单击​​该图标并查看其 url。您将获得类似于我在下面分配给变量的内容:

    string url = "http://test81/sitecore/shell/Applications/-/media/B4F61650CBE84EE396649602C0C48E1B.ashx?bc=White&db=master&h=128&la=en&mw=640&thn=1&vs=1&ts=b8046903-ae57-4f9d-9dd5-b626ee5eee90";
    

    当然,您的 URL 应该包含您的主机名和媒体前缀以及其他参数。然后将 Webclient 与修改后的 URL 一起使用:

    WebClient webClient = new WebClient();
    webClient.DownloadFile(url, "e:\\you_file_name.ico");
    

    不理想,但可能有效。请注意,上面的代码应该在已登录用户的上下文中工作,因此您需要事先授权您的 Webclient(许多关于 S.O. 如何做到这一点的文章)。

    如果该方法对您有用,请回复(我花了很多时间在调试器中编写和测试该代码,所以想知道这是否有帮助

    【讨论】:

    • 如何将服务器上的var icon 保存为图像文件。谢谢!
    • 刚刚用代码更新了我的答案以通过流将图标保存到磁盘
    • var field = item.Fields["__Icon"] 不是 blob 字段。我已经检查了调试器 IsBlobField 的值 false 并且 HasBlobStream 也是 false
    • 我再次更新了我的答案,请测试对我来说效果很好的更新代码,如果有效,请告诉我
    • 谢谢。但是iconField.HasBlobStream 总是错误的。我尝试使用 __Icon 和 __Thumbnail。但它总是假的。我尝试使用图像文件,即使它是错误的。我的意思是媒体项目中的 jpg 文件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-11
    相关资源
    最近更新 更多