Umbraco 7 自定义媒体类型拖放功能
Umbraco 7 Custom Media Type Drag and Drop functionality
所以刚刚开始使用 Umbraco 7 站点进行一些工作。
该站点具有自定义媒体类型。添加媒体(包括通过拖放)并选择此自定义类型时,添加的文件的完整 path/url 似乎没有存储在任何地方。
我已经为 MediaService.Saved 事件添加了一个侦听器并且它正在触发,但是在这个方法中,我似乎拥有的所有可用信息都是文件的 ID 和名称,而不是文件本身。
我原以为 "umbracoFile" 属性 会自动填充,但似乎并非如此。 [我什至尝试编辑我的自定义媒体类型以具有别名 "umbracoFile" 的 属性,但这只会导致后端崩溃。
有没有办法获取文件的 url/path 或强制 Umbraco 设置 "umbracoFile" 属性?
当您对文件夹浏览器控件(用于文件夹的媒体部分或媒体选择器对话框中)执行拖放操作时,Umbraco 会检查您拖到上传区域的文件类型,并且基于此确定要创建的最佳媒体类型。默认情况下,对于属于 Image
媒体类型的任何已知图像类型(png、jpg、gif 等),其他任何内容都会自动分配给 File
媒体类型。
当您挂接到 MediaService.Saved 事件时,您可以访问 Umbraco Media 中表示该文件的对象,但它已根据上述描述保存为特定文件类型 (这在 7.5.9 中有所改变 - 请参阅下面的注释)。如果您想启用自己的媒体类型并将其设置为可拖放,则需要深入挖掘。
注意:这仅适用于 Umbraco 的最新版本,截至 7.5.9 - 您的情况可能会有所不同。
在将文件上传到您首选的媒体类型时,您可能需要查看设置 contentTypeAlias
数据的 contentTypeAlias
参数,这可能需要您创建自己的文件夹版本浏览器数据类型。
由于 Robert 的回答,最终得到了一些有用的东西 - 它相当 hacky 但似乎有效所以我将把它留在这里以防它帮助其他人。
请注意,它使用折旧的事件处理程序和反射来设置私有变量,因此我不建议其他人使用它,但它可能会让人们知道从哪里开始:
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;
}
基本前提是在创建媒体类型时将媒体类型更改为图像。通过以这种方式更改它,可以添加并自动填充图像媒体类型的任何额外属性。如果自定义媒体类型上的 属性 与图像媒体类型属性之一(例如 umbracoFile)共享别名,则该属性值会自动填充,这意味着它可以在任何 Saving/Saved 事件侦听器中使用根据需要。
所以刚刚开始使用 Umbraco 7 站点进行一些工作。 该站点具有自定义媒体类型。添加媒体(包括通过拖放)并选择此自定义类型时,添加的文件的完整 path/url 似乎没有存储在任何地方。
我已经为 MediaService.Saved 事件添加了一个侦听器并且它正在触发,但是在这个方法中,我似乎拥有的所有可用信息都是文件的 ID 和名称,而不是文件本身。
我原以为 "umbracoFile" 属性 会自动填充,但似乎并非如此。 [我什至尝试编辑我的自定义媒体类型以具有别名 "umbracoFile" 的 属性,但这只会导致后端崩溃。
有没有办法获取文件的 url/path 或强制 Umbraco 设置 "umbracoFile" 属性?
当您对文件夹浏览器控件(用于文件夹的媒体部分或媒体选择器对话框中)执行拖放操作时,Umbraco 会检查您拖到上传区域的文件类型,并且基于此确定要创建的最佳媒体类型。默认情况下,对于属于 Image
媒体类型的任何已知图像类型(png、jpg、gif 等),其他任何内容都会自动分配给 File
媒体类型。
当您挂接到 MediaService.Saved 事件时,您可以访问 Umbraco Media 中表示该文件的对象,但它已根据上述描述保存为特定文件类型 (这在 7.5.9 中有所改变 - 请参阅下面的注释)。如果您想启用自己的媒体类型并将其设置为可拖放,则需要深入挖掘。
注意:这仅适用于 Umbraco 的最新版本,截至 7.5.9 - 您的情况可能会有所不同。
在将文件上传到您首选的媒体类型时,您可能需要查看设置 contentTypeAlias
数据的 contentTypeAlias
参数,这可能需要您创建自己的文件夹版本浏览器数据类型。
由于 Robert 的回答,最终得到了一些有用的东西 - 它相当 hacky 但似乎有效所以我将把它留在这里以防它帮助其他人。
请注意,它使用折旧的事件处理程序和反射来设置私有变量,因此我不建议其他人使用它,但它可能会让人们知道从哪里开始:
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;
}
基本前提是在创建媒体类型时将媒体类型更改为图像。通过以这种方式更改它,可以添加并自动填充图像媒体类型的任何额外属性。如果自定义媒体类型上的 属性 与图像媒体类型属性之一(例如 umbracoFile)共享别名,则该属性值会自动填充,这意味着它可以在任何 Saving/Saved 事件侦听器中使用根据需要。