2015-11-04 91 views
3

更新2: 我仍然努力获得服务器上的图标保存。Sitecore如何获得媒体项目的媒体领域内的价值

我在这里做什么:

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()然后我会得到完整的文件。我只是想在服务器上保存这个小图标。可能吗 ?

回答

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中的字段。在最糟糕的情况下,您可以执行以下操作 - 右键单击​​该图标并查看其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.上的许多文章如何做到这一点)。

请回复,如果这种做法已经为你工作(我花了体面的时间编写和测试调试器的代码,所以想知道这是否有助于

+0

如何将'var icon'作为图像文件保存在服务器上。谢谢! – Kamran

+0

刚刚更新我的答案,通过流 –

+0

'var field = item.Fields [“__ Icon”]'不是一个blob字段的图标保存到磁盘的代码。我在调试器中检查过'IsBlobField'的值为'false','HasBlobStream'也是'false'。 – Kamran

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; 
} 

这将让附加到媒体项目的实际媒体斑点图标或缩略图。如果您只需要Sitecore项目的图标,则使用Martins方法。

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

+1

但是,如何在服务器上面的案例中保存'iconStream'。我的意思是用'System.IO'流说我可以使用'.CopyTo(path)'然后保存流。 – Kamran

+1

是的,我得到了'var stream = iconStream.Stream;' – Kamran

+0

很抱歉打扰你,但是如果文件不是图像文件,那么用这种方法保存文件是不成功的。文件大小为0 KB。例如在Excel文件中。 – Kamran