2015-11-04 134 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