在Sitecore 7.5中如何以编程方式创建具有语言版本控制的媒体项?

时间:2015-06-09 12:46:17

标签: sitecore sitecore7 sitecore7.5 sitecore-media-library

我希望能够在代码中创建/更新媒体项目,还可以使用语言版本控制。这里有更具体的细节。我有一个产品内容项。保存该项目后,我希望能够生成该项目的PDF版本并将其保存到媒体库。如果媒体库中已存在PDF版本,我需要能够更新它。此外,这是一个多语言网站。因此,如果有人保存了产品内容项的法语版本,我需要能够生成PDF的法语版本,并且只在媒体库中保存/更新相关PDF的法语版本 - 不要触及任何其他语言版本PDF。我似乎无法弄清楚如何做到这一点。我目前的代码执行以下操作:如果我保存产品的英文版本,则会创建PDF版本和英文版本。但是如果我保存产品的法语版本,它会创建一个法语版本的PDF并删除PDF的英文版本。

任何人都知道怎么做?

    public static Item AddMediaItem(byte[] fileBuffer, string fullMediaPath, string fileNameWithExtension, string title, Language language)
    {
        try
        {
            var db = Sitecore.Configuration.Factory.GetDatabase("master");
            var options = new MediaCreatorOptions();
            options.FileBased = false;
            options.IncludeExtensionInItemName = false;
            options.KeepExisting = false;
            options.Versioned = true;
            options.Destination = fullMediaPath;
            options.Database = db;
            options.Language = language;

            var creator = new MediaCreator();
            var fileStream = new MemoryStream(fileBuffer);

            var pdfItem = db.GetItem(fullMediaPath, language);
            if (pdfItem != null)
            {
                var updatedItem = creator.AttachStreamToMediaItem(fileStream, fullMediaPath, fileNameWithExtension,
                    options);
                updatedItem.Editing.BeginEdit();
                updatedItem.Fields["Title"].Value = title;
                updatedItem.Editing.EndEdit();
                return updatedItem;
            }
            else
            {
                //Create a new item
                var newItem = creator.CreateFromStream(fileStream, fileNameWithExtension, options);
                newItem.Editing.BeginEdit();
                newItem.Fields["Title"].Value = title;
                newItem.Editing.EndEdit();
                return newItem;
            }
        }
        catch (Exception ex)
        {
            return null;
        }
    }

2 个答案:

答案 0 :(得分:2)

感谢@JanBluemink指出我正确的方向。我在下面的文章中找到了正确的方法:Sitecore.Resources.Media.MediaCreator deletes versions of media。我只需要在更新时修改代码以使用MediaManager而不是MediaCreator。

    public static Item AddMediaItem(byte[] fileBuffer, string fullMediaPath, string fileNameWithExtension, string title, Language language)
    {
        try
        {
            var db = Sitecore.Configuration.Factory.GetDatabase("master");
            var options = new MediaCreatorOptions();
            options.FileBased = false;
            options.IncludeExtensionInItemName = false;
            options.KeepExisting = false;
            options.Versioned = true;
            options.Destination = fullMediaPath;
            options.Database = db;
            options.Language = language;

            var creator = new MediaCreator();
            var fileStream = new MemoryStream(fileBuffer);

            var pdfItem = db.GetItem(fullMediaPath, language);
            if (pdfItem != null)
            {
                var mediaItem = new MediaItem(pdfItem);
                var media = MediaManager.GetMedia(mediaItem);
                media.SetStream(fileStream, "pdf");

                pdfItem.Editing.BeginEdit();
                pdfItem.Fields["Title"].Value = title;
                pdfItem.Editing.EndEdit();
                return pdfItem;
            }
            else
            {
                //Create a new item
                var newItem = creator.CreateFromStream(fileStream, fileNameWithExtension, options);
                newItem.Editing.BeginEdit();
                newItem.Fields["Title"].Value = title;
                newItem.Editing.EndEdit();
                return newItem;
            }
        }
        catch (Exception ex)
        {
            return null;
        }
    }

答案 1 :(得分:0)

我必须添加几行来更新存储在文件系统中的媒体项目并进行版本控制。

if (mediaItem.FileBased)
        {
            string uniqueFilename = FileUtil.GetUniqueFilename(FileUtil.MakePath(Settings.Media.FileFolder, MediaManager.Creator.GetMediaStorageFolder(mediaItem.ID, fileshortname)));
            using (new Sitecore.SecurityModel.SecurityDisabler())
            {
                mediaItem.BeginEdit();
                mediaItem.FilePath = uniqueFilename;
                mediaItem.EndEdit();
            }
        }
        Media media = MediaManager.GetMedia(mediaItem);
        using (FileStream stream = new FileStream(fileName, FileMode.Open))
        {
            media.SetStream(stream, FileUtil.GetExtension(fileshortname));
        }`