如何在Optimizely CMS 11中检测媒体文件上传事件?
Optimizely CMS 11 检测媒体文件上传事件的解决方案
在Optimizely CMS 11中,媒体文件上传时的自动发布流程不会触发ContentChanged事件——该事件仅针对已有内容的修改操作。要检测图片上传,可改用IContentEvents接口的CreatedContent事件,它会在媒体文件创建(包括上传)时触发。
实现步骤
- 在初始化模块中注册事件处理程序:
[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
相关产品推荐
相关产品推荐

