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 中有所改变 - 请参阅下面的注释)。如果您想启用自己的媒体类型并将其设置为可拖放,则需要深入挖掘。

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

注意:这仅适用于 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 事件侦听器中使用根据需要。