Umbraco 7自定义媒体类型拖放功能



所以刚刚开始使用Umbraco 7网站进行一些工作。网站具有自定义媒体类型。添加媒体(包括拖放)并选择此自定义类型时,添加的文件的完整路径/url似乎不会存储在任何位置。

我已经向MediaService.Saved事件添加了一个侦听器,这正在启动,但在这个方法中,我似乎拥有的所有可用信息都是文件的id和名称,而不是文件本身。

我原以为"umbracoFile"属性会自动填充,但事实并非如此。[我甚至尝试编辑我的自定义媒体类型,使其具有别名为"umbracoFile"的属性,但这只会导致后端崩溃]。

是否有获取文件的url/路径或强制Umbraco设置"umbracoFile"属性的方法?

当您在文件夹浏览器控件上执行拖放操作(在文件夹的"媒体"部分或"媒体选择器"对话框中使用)时,Umbraco会检查您拖动到上载区域的文件类型,并在此基础上确定要创建的最佳媒体类型。默认情况下,对于Image媒体类型的任何已知图像类型(png、jpg、gif等),其他任何图像都会自动分配给File媒体类型。

当您挂接到MediaService.Saved事件时,您可以访问Umbraco Media中代表该文件的对象,但它已经根据上面的描述保存为特定的文件类型(这在7.5.9中有一点变化-请参阅下面的注释)。如果你想启用自己的媒体类型并将其设置为拖放,你需要更深入地挖掘。

看看这个:https://github.com/umbraco/Umbraco-CMS/blob/dev-v7/src/Umbraco.Web/Editors/MediaController.cs#L626-L638

注意:这仅适用于最新版本的Umbraco,自7.5.9起-您的里程数可能会有所不同。

当将文件上传到您喜欢的媒体类型时,您可能需要查看帖子数据的contentTypeAlias参数的设置,这可能需要您创建自己版本的文件夹浏览器数据类型。

多亏了Robert的回答,终于有了一些效果——它相当粗糙,但似乎有效,所以我将把它留在这里,以防它对其他人有帮助。

请注意,它使用折旧后的事件处理程序和反射来设置私有变量,所以我不建议其他人使用它,但它可能会让人们知道从哪里开始:

public void MediaService_Creating(IMediaService sender, NewEventArgs<IMedia> e)
{
int i = 0;
Type t = e.Entity.GetType();
FieldInfo[] fields = t.GetFields(BindingFlags.NonPublic | BindingFlags.Instance);
FieldInfo field = fields.First(x => x.Name == "_contentType");
MethodInfo findMediaTypeByAlias = ApplicationContext.Current.Services.MediaService
.GetType().GetMethod("FindMediaTypeByAlias", BindingFlags.NonPublic | BindingFlags.Instance);
IMediaType mediaType = (IMediaType)findMediaTypeByAlias.Invoke(
ApplicationContext.Current.Services.MediaService,
new object[] { Constants.Conventions.MediaTypes.Image });
field.SetValue(e.Entity, mediaType);
field = fields.First(x => x.Name == "ContentTypeBase");
field.SetValue(e.Entity, mediaType);
i = e.Entity.ContentTypeId;
}

基本前提是在创建媒体类型时将媒体类型更改为图像。通过以这种方式更改它,可以添加并自动填充图像介质类型的任何额外属性。如果自定义媒体类型上的某个属性与某个Image媒体类型属性(如umbracoFile)共享别名,则会自动填充该属性值,这意味着它可以根据需要在任何Saving/Saved事件侦听器中使用。