更新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
中的字符串并将其粘贴到浏览器中,我可以看到如下图标:
请让我知道我做错了什么。或者我如何保存图标。谢谢!
原始问题:
sitecore媒体项目有一个字段“Media
”。我在说这个:
我想访问此字段。原因是:
如果我使用例如item.GetMediaStream()
然后我将获得完整的文件。我只是想在服务器上保存这个小图标。可能吗 ?
答案 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.的许多文章如何做到这一点)。
如果这种方法对您有用,请回复(我花了不少时间在调试器中编写和测试该代码,所以想知道这是否有帮助)