You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Optimizely CMS 11中检测媒体文件上传事件?

Optimizely CMS 11 检测媒体文件上传事件的解决方案

在Optimizely CMS 11中,媒体文件上传时的自动发布流程不会触发ContentChanged事件——该事件仅针对已有内容的修改操作。要检测图片上传,可改用IContentEvents接口的CreatedContent事件,它会在媒体文件创建(包括上传)时触发。

实现步骤

  1. 在初始化模块中注册事件处理程序:
[InitializableModule]
[ModuleDependency(typeof(EPiServer.Web.InitializationModule))]
public class MediaProcessingInitializer : IInitializableModule
{
    private IContentEvents _contentEvents;

    public void Initialize(InitializationEngine context)
    {
        _contentEvents = context.Locate.Advanced.GetInstance<IContentEvents>();
        _contentEvents.CreatedContent += HandleMediaCreated;
        // 可选:注册SavedContent事件处理媒体文件替换场景
        _contentEvents.SavedContent += HandleMediaUpdated;
    }

    private void HandleMediaCreated(object sender, ContentEventArgs e)
    {
        // 过滤仅处理图片类型(可替换为你的自定义媒体类型)
        if (e.Content is ImageData uploadedImage)
        {
            // 执行衍生图片生成逻辑
            GenerateDerivedImages(uploadedImage);
        }
    }

    private void HandleMediaUpdated(object sender, ContentEventArgs e)
    {
        // 当媒体文件被替换时,重新生成衍生图
        if (e.Content is ImageData updatedImage && e.Action.HasFlag(SaveAction.Publish))
        {
            GenerateDerivedImages(updatedImage);
        }
    }

    private void GenerateDerivedImages(ImageData media)
    {
        // 示例:读取媒体文件的Blob流
        using (var stream = media.BinaryData.OpenRead())
        {
            // 此处添加你的图片处理逻辑,如生成不同尺寸的缩略图
            // 可结合System.Drawing或第三方图片库(如ImageSharp)实现
            // ...
        }
    }

    public void Uninitialize(InitializationEngine context)
    {
        if (_contentEvents != null)
        {
            _contentEvents.CreatedContent -= HandleMediaCreated;
            _contentEvents.SavedContent -= HandleMediaUpdated;
        }
    }
}

关键说明

  • CreatedContent事件覆盖所有媒体创建场景:包括手动单文件上传、批量上传、API创建的媒体项。
  • 若需区分上传行为和代码创建的媒体,可通过e.Action判断是否包含SaveAction.Publish——默认上传流程会自动发布媒体,而代码创建可能仅保存为草稿。
  • 注册SavedContent事件可处理媒体文件被替换的场景,此时需要重新生成衍生图。

关于媒体自动发布行为的修改(可选)

若要修改媒体上传时自动发布的默认行为,可通过自定义ContentSaveHandler拦截保存流程,调整SaveAction参数:

public class CustomMediaSaveHandler : ContentSaveHandler
{
    public override void SaveContent(IContent content, SaveAction action, AccessLevel access)
    {
        if (content is ImageData && action.HasFlag(SaveAction.Publish))
        {
            // 将自动发布改为仅保存草稿
            base.SaveContent(content, SaveAction.Save, access);
        }
        else
        {
            base.SaveContent(content, action, access);
        }
    }
}

随后在初始化模块中注册该处理器:

context.Locate.Advanced.GetInstance<IContentHandlerRegistry>().Register<IContent, SaveContentEventArgs>(new CustomMediaSaveHandler());

内容的提问来源于stack exchange,提问作者Jag

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 15:37:18