Sitecore如何在媒体项的“媒体”字段中获取值

时间:2015-11-04 14:33:14

标签: sitecore sitecore7.2

更新2: 我仍在努力让服务器上的Icon保存。

我在做什么:

  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中的字符串并将其粘贴到浏览器中,我可以看到如下图标:

enter image description here

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

原始问题:

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

enter image description here

我想访问此字段。原因是:

如果我使用例如item.GetMediaStream()然后我将获得完整的文件。我只是想在服务器上保存这个小图标。可能吗 ?

2 个答案:

答案 0 :(得分:5)

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

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

获取缩略图的网址。

如果您想要缩略图流,则需要使用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

答案 1 :(得分:0)

外观部分(标准模板)有一个名为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:

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

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

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