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

时间:2017-02-14 17:13:07

标签: umbraco umbraco7 media-type

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

我已经为MediaService.Saved事件添加了一个监听器,但是这个问题正在解决,但在这个方法中,我看来可用的所有信息都是文件的id和名称,而不是文件本身。

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

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

2 个答案:

答案 0 :(得分:1)

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

当你挂钩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 - 您的里程可能会有所不同。

您可能需要在将文件上传到首选媒体类型时查看设置发布数据的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事件侦听器中使用。