使用Sitecore 6.5,当在网页上呈现图像时,会使用如下所示的URL
~/media/OSS/Images/MyImage
但是如果您在内容编辑器中添加库中的图像,则使用下面的路径
~/media/1CFDDC34C94E460FAA2B1518DCA22360.PNG
这很有意义,因为它在为网络渲染时尝试使用有意义的路径。
我们希望使用第一个媒体图像路径在HTML视图中的内容编辑器中添加图像,而不是默认的第二种方法。这是因为我们实际上正在使用一些html文件并通过脚本自动将它们添加到Sitecore中,如果使用约定使用第一个图像格式,我们可以将图像路径更改为媒体库中的某个位置,这样图像就会出现在新创建的项目中。我们现在已经了解了媒体库图像ID。
第一种格式似乎确实有效,因为图像在内容编辑器设计编辑器中呈现,并且在呈现页面时,Sitecore会在内容编辑器中将这些标记标记为已损坏的链接。关于我们是否可以安全使用这种格式有任何想法吗?
答案 0 :(得分:3)
您可能希望避免在富文本字段中硬编码媒体路径。第二个“动态链接”是Sitecore的一个重要特性,它保持了Links数据库中媒体和项目之间的连接。如果您删除或移动媒体,这可以保护您。
由于听起来您正在从外部源导入内容并且您已经有了检测图像路径的方法,我建议(如果可能)以编程方式上传图像并插入动态链接。
以下是您可以调用以上传到媒体库并取回媒体项目的功能:
使用示例:
var file = AddFile("/assets/images/my-image.jpg", "/sitecore/media library/images/example", "my-image");
代码:
private MediaItem AddFile(string relativeUrl, string sitecorePath, string mediaItemName)
{
var extension = Path.GetExtension(relativeUrl);
var localFilename = @"c:\temp\" + mediaItemName + extension;
using (var client = new WebClient())
{
client.DownloadFile("http://yourdomain.com" + relativeUrl, localFilename);
}
// Create the options
var options = new MediaCreatorOptions
{
FileBased = false,
IncludeExtensionInItemName = false,
KeepExisting = false,
Versioned = false,
Destination = sitecorePath + "/" + mediaItemName,
Database = Factory.GetDatabase("master")
};
// Now create the file
var creator = new MediaCreator();
var mediaItem = creator.CreateFromFile(localFilename, options);
return mediaItem;
}
至于生成媒体的动态链接,我实际上还没有找到Sitecore方法来执行此操作,因此我使用了以下代码:
var extension = !String.IsNullOrEmpty(Settings.Media.RequestExtension)
? Settings.Media.RequestExtension
: ((MediaItem)item).Extension;
var dynamicMediaUrl = String.Format(
"{0}{1}.{2}",
MediaManager.MediaLinkPrefix,
item.ID.ToShortID(),
extension);
答案 1 :(得分:1)
除非您注意到断开的链接通知,否则它不会导致任何渲染问题。此外,当您在编辑器中选择图像并选择编辑时,媒体文件夹将位于根目录而不是图像本身。但正如Derek所指出的,使用动态链接是一项重要功能,可确保在移动或删除某些内容时链接不会中断。
我想补充一点,因为你通过脚本添加文本,你可以使用HtmlAgilityPack(已在Sitecore中使用)或FizzlerEx检测文本中的图像(更类似于jQuery语法) ),使用他提供的代码将图像上传到媒体库,获取GUID并替换src。有点像:
string content = "<whatever your html to go in the rich text field>";
HtmlDocument doc = new HtmlDocument();
doc.Load(content);
foreach(HtmlNode img in doc.DocumentElement.SelectNodes("//img[starts-with(@src, '/media/')]")
{
HtmlAttribute attr = img["src"];
Item scMediaItem = UploadLocalMedia(attr.Value);
attr.Value = GetDynamicMediaUrl(scMediaItem);
}