EPiServer 11:以编程方式转换媒体类型

Mrpotocnik

是否有人尝试在EPiServer中以编程方式转换媒体文件类型?

我们有一个为图像,ImageFile建模的类型,以及一个通过插件添加的类型。我们没有使用插件添加的类型,但发现上传的图像会不时被创建为错误的类型。我希望弄清楚如何进行转换,以便我可以运行计划的作业来批量转换所有内容,然后删除插件。

到目前为止,我可以通过编程方式将A复制为B类型,然后删除A。我真正想做的是将A转换为B以实现无缝过渡。

我尝试的第一件事是将映像克隆为正确的类型,但结果为null

var media = _contentRepository.Service.GetDescendents(SiteDefinition.Current.GlobalAssetsRoot)
                .Where(i => _contentRepository.Service.Get<IContent>(i) is MediaData);
var imageFileTypeId = new ImageFile().ContentTypeID;
foreach (var img in media)
{
    if (img.Get<IContent>() is GcEpiImageFile)
    {
         count++ // for summary
         var item = _contentLoader.Service.Get<GcEpiImageFile>(img.Get<IContent>().ContentLink);
         var cloneItem = item.CreateWritableClone() as ImageFile;
         if (cloneItem == null) 
         {
             var msg = $"{item.Name}: {item.ContentLink.ID} came up null";
             OnStatusChanged(msg);
             summaryMessage.AppendLine(msg);
             continue;
         }
         cloneItem.ContentTypeID = imageFileTypeId;
         _contentRepository.Service.Save(cloneItem, SaveAction.Publish, AccessLevel.NoAccess);

    }

我尝试的下一步是将其克隆为似乎创建对象的基类ImageData,但在保存时会抛出未设置为对象异常实例的Object引用。

var media = _contentRepository.Service.GetDescendents(SiteDefinition.Current.GlobalAssetsRoot)
                .Where(i => _contentRepository.Service.Get<IContent>(i) is MediaData);
var imageFileTypeId = new ImageFile().ContentTypeID;
foreach (var img in media)
{
    if (img.Get<IContent>() is GcEpiImageFile)
    {
         count++ // for summary
         var item = _contentLoader.Service.Get<GcEpiImageFile>(img.Get<IContent>().ContentLink);
         var cloneItem = item.CreateWritableClone() as ImageData;
         if (cloneItem == null) 
         {
             var msg = $"{item.Name}: {item.ContentLink.ID} came up null";
             OnStatusChanged(msg);
             summaryMessage.AppendLine(msg);
             continue;
         }
         try
         { 
             cloneItem.ContentTypeID = imageFileTypeId;
         }
         catch (Exception ex)
         {
             summaryMessage.AppendLine($"exception triggered by id assignment {ex.Message}<br />{ex.InnerException}");
         }
         try
         { 
             _contentRepository.Service.Save(cloneItem, SaveAction.Publish, AccessLevel.NoAccess);
         }
         catch (Exception ex)
         {
             summaryMessage.AppendLine(
                            $"exception triggered by save {ex.Message}<br />{ex.InnerException}");
         }
    }

这是我的堆栈跟踪:

Object reference not set to an instance of an object.
at EPiServer.Validation.Internal.RoutingSegmentValidator.Validate(IContent instance) at

EPiServer.Validation.Internal.ContextValidatorWrapper`2.Validate(Object instance, Object context) 

at EPiServer.Validation.Internal.ValidationService.ValidateRecursively(Object instance, Object context, HashSet`1 visitedInstances) 

at EPiServer.Validation.Internal.ValidationService.Validate[T](Object instance, T context) 

at EPiServer.Core.ContentProvider.Validate(IContent content, ContentSaveValidationContext saveValidationContext) 

at EPiServer.Core.Internal.DefaultContentRepository.Save(IContent content, SaveAction action, AccessLevel access) at Web.Business.ScheduledJobs.ImageConversion.Execute()

任何想法,帮助,指导将不胜感激

Mrpotocnik

EPiServer开发人员论坛上向Johann Kronberg致以技巧性的帮助。

BEGIN TRANSACTION [ConvertTransaction]
BEGIN TRY
  DECLARE @FromPropertyID1 int
  DECLARE @ToPropertyID1 int
  DECLARE @FromPropertyID2 int
  DECLARE @ToPropertyID2 int
  DECLARE @FromPropertyID3 int
  DECLARE @ToPropertyID3 int

  DECLARE @RC int
  DECLARE @PageID int
  DECLARE @FromPageType int
  DECLARE @ToPageType int
  DECLARE @Recursive bit
  DECLARE @IsTest bit

  SELECT @PageID = 1
#get your type ids from content type guid
  SELECT @FromPageType = pkID FROM tblContentType WHERE ContentTypeGUID = 'guid of the media type being changed'
  SELECT @ToPageType = pkID FROM tblContentType WHERE ContentTypeGUID = 'guid of the media type it is being change to'


#mapping properties THIS IS IMPORTANT!!!

  SELECT @FromPropertyID1 = pkID FROM tblPropertyDefinition WHERE fkContentTypeID = @FromPageType AND [Name] = 'Copyright'
  SELECT @FromPropertyID2 = pkID FROM tblPropertyDefinition WHERE fkContentTypeID = @FromPageType AND [Name] = 'Description'
  SELECT @FromPropertyID3 = pkID FROM tblPropertyDefinition WHERE fkContentTypeID = @FromPageType AND [Name] = 'Notes'

  SELECT @ToPropertyID1 = pkID FROM tblPropertyDefinition WHERE fkContentTypeID = @ToPageType AND [Name] = 'Copyright'
  SELECT @ToPropertyID2 = pkID FROM tblPropertyDefinition WHERE fkContentTypeID = @ToPageType AND [Name] = 'Alt Text'
  SELECT @ToPropertyID3 = pkID FROM tblPropertyDefinition WHERE fkContentTypeID = @ToPageType AND [Name] = 'Notes'

  SET @Recursive = 1
  SET @IsTest = 0

  print @PageID
  print @FromPageType
  print @ToPageType

  DECLARE @MasterLanguageID int

  SET @MasterLanguageID = 8

  EXECUTE @RC = [dbo].[netConvertPropertyForPageType]
     @PageID
    ,@FromPageType
    ,@FromPropertyID1
    ,@ToPropertyID1
    ,@Recursive
    ,@MasterLanguageID
    ,@IsTest

  print @RC

  EXECUTE @RC = [dbo].[netConvertPropertyForPageType]
     @PageID
    ,@FromPageType
    ,@FromPropertyID2
    ,@ToPropertyID2
    ,@Recursive
    ,@MasterLanguageID
    ,@IsTest

  print @RC

  EXECUTE @RC = [dbo].[netConvertPropertyForPageType]
     @PageID
    ,@FromPageType
    ,@FromPropertyID3
    ,@ToPropertyID3
    ,@Recursive
    ,@MasterLanguageID
    ,@IsTest

  print @RC

  EXECUTE @RC = [dbo].[netConvertPageType]
     @PageID
    ,@FromPageType
    ,@ToPageType
    ,@Recursive
    ,@IsTest

  print @RC

  COMMIT TRANSACTION [ConvertTransaction]
END TRY
BEGIN CATCH
  ROLLBACK TRANSACTION [ConvertTransaction]
END CATCH
-- Run separately
DECLARE @FromPageType int
SELECT @FromPageType = pkID FROM tblContentType WHERE ContentTypeGUID = '0a89e464-56d4-449f-aea8-2bf774ab8730'
EXECUTE netContentTypeDelete @ContentTypeID = @FromPageType

注意如果源类型的属性多于目标类型,则可能需要将属性添加到目标。在我的第一次运行中,我能够转换类型,但是无法删除目标类型。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Episerver 以编程方式创建页面

来自分类Dev

Episerver中的嵌套块类型

来自分类Dev

如何以编程方式设置EpiServer.Url属性

来自分类Dev

以编程方式 Umbraco 页面类型(就像在 Episerver 中一样)

来自分类Dev

Episerver-删除媒体/块库中的所有内容

来自分类Dev

将 EPiserver 媒体 blob 迁移到 Azure 存储帐户

来自分类Dev

是否可以在 EpiServer 中限制页面类型的实例?

来自分类Dev

将IEnumerable <PageData>强制转换为Episerver PageDataCollection

来自分类Dev

EpiServer:将字符串转换为XHTMLString

来自分类Dev

EpiServer-以编程方式将块添加到内容区域

来自分类Dev

EPiServer 9-以编程方式将块添加到新页面

来自分类Dev

Episerver 促销

来自分类Dev

Episerver - 拦截 PublishedContent 事件时页面类型变为不可编辑

来自分类Dev

EpiServer启动缓慢

来自分类Dev

在Episerver中截断Xhtmlstring

来自分类Dev

Episerver空属性

来自分类Dev

寻找EpiServer文档

来自分类Dev

EPiServer 7的调试符号

来自分类Dev

Episerver 块按钮

来自分类Dev

Episerver 中的块

来自分类Dev

EPiServer社区成员的头像错误

来自分类Dev

EpiServer - easy way to mock UrlResolver

来自分类Dev

EPiServer缺少英文文本

来自分类Dev

Episerver HttpGet方法返回null

来自分类Dev

自定义语言处理EPiServer

来自分类Dev

在EpiServer中渲染不同的部分模板

来自分类Dev

EpiServer上缺少小工具

来自分类Dev

EpiServer-模拟UrlResolver的简单方法

来自分类Dev

使用EPiServer查找索引页面文件