所以刚刚开始使用Umbraco 7网站。 该网站具有自定义媒体类型。添加媒体(包括通过拖放)并选择此自定义类型时,添加的文件的完整路径/网址似乎不会存储在任何位置。
我已经为MediaService.Saved事件添加了一个监听器,但是这个问题正在解决,但在这个方法中,我看来可用的所有信息都是文件的id和名称,而不是文件本身。
我期待“umbracoFile”属性自动填充,但似乎并非如此。 [我甚至尝试编辑我的自定义媒体类型,使其具有别名为“umbracoFile”的属性,但这只会导致后端崩溃]。
是否有获取文件的url /路径或强制Umbraco设置“umbracoFile”属性?
答案 0 :(得分:1)
在文件夹浏览器控件上执行拖放操作(在文件夹的“媒体”部分或“媒体选择器”对话框中使用)时,Umbraco会检查您拖动到上传区域的文件类型,并基于确定要创建的最佳媒体类型。默认情况下,对于{{ myVal | #pipeVar }}
媒体类型的任何已知图像类型(png,jpg,gif等),其他任何内容都会自动分配给Image
媒体类型。
当你挂钩MediaService.Saved事件时,你可以访问Umbraco Media中代表该文件的对象,但它已经根据上面的描述保存为特定的文件类型(这有在7.5.9中略有改变 - 见下面的注释)。如果要启用自己的媒体类型并将其设置为拖放,则需要深入挖掘。
注意:这仅适用于最新版本的Umbraco,截至7.5.9 - 您的里程可能会有所不同。
您可能需要在将文件上传到首选媒体类型时查看设置发布数据的File
参数,这可能需要您创建自己的文件夹浏览器数据类型版本。
答案 1 :(得分:0)
由于罗伯特的回答,最终得到了一些工作 - 它相当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;
}
基本前提是在创建媒体类型时将媒体类型更改为图像。通过以这种方式更改它,可以添加并自动填充Image媒体类型的任何额外属性。如果自定义媒体类型上的属性与其中一个Image媒体类型属性(例如umbracoFile)共享别名,则会自动填充该属性值,这意味着它可以根据需要在任何Saving / Saved事件侦听器中使用。