[ELMA3] Создание предпросмотра документа с различными форматами файлов
В статье приведен пример создания возможности предпросмотра документа, версией которого является видеофайл формата mp4.
Пример отображения данных
Рис. 1. Предпросмотр видеофайла в карточке документа
Рис. 2. Предпросмотр видеофайла в popup-окне
Методы расширения (интерфейса) IFilePreviewCreator
Точка расширения (интерфейс) IFilePreviewCreator имеет следующие методы:
/// <summary> /// Уникальный идентификатор /// </summary> Guid Uid { get; } /// <summary> /// Отображаемое имя /// </summary> string DisplayName { get; } /// <summary> /// Расширения файлов /// </summary> List<string> Extensions { get; } /// <summary> /// Имя главного файла /// </summary> /// <param name="file">Файл</param> /// <returns></returns> string GetMainFileName(BinaryFile file); /// <summary> /// Имя текстового файла /// </summary> /// <param name="file">Файл</param> /// <returns></returns> string GetTextFileName(BinaryFile file); /// <summary> /// Относительный путь до главного файла /// </summary> /// <param name="file">Файл</param> /// <returns></returns> string GetRelativeMainFileName(BinaryFile file); /// <summary> /// Создать превью /// </summary> /// <param name="path">Путь</param> /// <param name="file">Файл</param> void Create(string path, BinaryFile file); /// <summary> /// Доступен ли для использования /// </summary> /// <param name="file">Файл</param> /// <returns></returns> bool IsAvaliable(BinaryFile file); /// <summary> /// Имеется ли сгенерированая превью /// </summary> /// <param name="file">Файл</param> /// <returns></returns> bool HasPreview(BinaryFile file); /// <summary> /// Имеется ли сгенерированая превью /// </summary> /// <param name="file">Файл</param> /// <param name="priority">Приоритет</param> /// <returns></returns> bool HasPreview(BinaryFile file, long priority); /// <summary> /// Получение текстового представления превью для индексации /// </summary> /// <param name="file">Файл</param> /// <returns></returns> string GetPreviewText(BinaryFile file); /// <summary> /// Генерится превью в формате HTML /// </summary> /// <returns></returns> bool EnableGenerateHtml();
Пример класса точки расширения IFilePreviewCreator
[Component] public class VideoPreviewCreator : IFilePreviewCreator { private readonly Guid _uid = new Guid("{2B94E4DF-BCE2-4b54-AC85-3ABE24BB5F92}"); public Guid Uid { get { return _uid; } } public string DisplayName { get { return SR.T("Видео файлы (.mp4)"); } } public List<string> Extensions { get { return new List<string> { ".mp4" }; } } public string GetMainFileName(BinaryFile file) { return file.ContentFilePath; } public void Create(string path, BinaryFile file) { } public string GetPreviewText(BinaryFile file) { return null; } public bool EnableGenerateHtml() { return false; } public IRuntimeApplication RuntimeApplication { get; set; } public string PreviewDir { get { return null; } } public string GetRelativeMainFileName(BinaryFile file) { return null; } public virtual string GetTextFileName(string filePreviewDir, BinaryFile file) { return null; } public virtual string GetTextFileName(BinaryFile file) { return null; } public virtual string GetMainFileName(string filePreviewDir, BinaryFile file) { return GetTextFileName(filePreviewDir, file); } public virtual bool IsAvaliable(BinaryFile file) { var settings = Locator.GetService<PreviewSettingsModule>(); return settings == null || settings.IsEnabledPreview(this); } public virtual bool HasPreview(BinaryFile file) { return HasPreview(file, 5); } public virtual bool HasPreview(BinaryFile file, long priority) { return true; } protected virtual Encoding GetFileEncoding(string filename) { var fileContent = File.ReadAllBytes(filename); return EncodingTools.DetectInputCodepage(fileContent); } }
Методы расширения (интерфейса) IFilePreviewCreatorRender
Guid Uid { get; } Type CreatorType { get; } /// <summary> /// Рендер (отрисовка Preview) /// </summary> /// <param name="helper">Хелпер</param> /// <param name="file">Файл</param> /// <returns></returns> bool Render(HtmlHelper helper, BinaryFile file); /// <summary> /// Наименование инициализующей функции JavaScript, которая инициализирует отрисовку Preview (До отрисовки самого Preview) /// </summary> /// <param name="uniquePrefix">Уникальный префикс</param> /// <returns>Наименование инициализирующей функции с префиксом</returns> string InitFunctionName(string uniquePrefix); /// <summary> /// Наименование onClose функции JavaScript /// </summary> /// <param name="uniquePrefix">Уникальный префикс</param> /// <returns>Наименование onClose функции с префиксом</returns> string CloseFunctionName(string uniquePrefix); /// <summary> /// Наименование для функции JavaScript расчета тулбара (если таковой имеется), например, для расчета его позиции на странице /// </summary> /// <param name="uniquePrefix">Уникальный префикс</param> /// <returns>Наименование для функции расчета тулбара с префиксом</returns> string CalcToolbarFunctionName(string uniquePrefix);
Пример класса точки расширения IFilePreviewCreatorRender
[Component] public class VideoPreviewCreatorRenderer : IFilePreviewCreatorRenderer { public static Guid UID = new Guid("{BF13D8F8-2AC4-457b-A96A-2992182AEEB5}"); public Guid Uid { get { return UID; } } public Type CreatorType { get { return typeof(VideoPreviewCreator); } } public virtual string InitFunctionName(string uniquePrefix) { return null; } public virtual string CloseFunctionName(string uniquePrefix) { return "ClosePreview"; } public virtual string CalcToolbarFunctionName(string uniquePrefix) { return null; } public virtual bool Render(HtmlHelper helper, BinaryFile file) { var previewService = Locator.GetServiceNotNull<IFilePreviewService>(); var creator = previewService.GetPreviewCreator(file); if (creator != null) { var model = new BaseFilePreviewInfo { File = file, PreviewCreator = creator }; helper.RenderPartial("Video", model); } return true; } }
Как можно заметить из приведенного примера кода, Рендер (отрисовка Preview) ссылается на Ваше представление Video, в котором находится разметка с видеофайлом. Представление необходимо расположить по пути Веб-часть_Вашего_Модуля\Views\Shared\. Пример кода Video.cshtml:
@model EleWise.ELMA.Web.Mvc.Models.Previews.BaseFilePreviewInfo @using EleWise.ELMA @{ var fileUid = UIExtensions.PrepareId(Model.File.Id ?? Model.File.Uid.ToString()); var uniqueGlobalPrefix = ViewData["UniqueGlobalPrefix"] ?? string.Empty; var videoid = String.Format("Video_{0}", Model.File.Uid); var previewToolbarId = string.Format("previewImgToolbar_{0}{1}", uniqueGlobalPrefix, fileUid); var closePreviewFunc = "ClosePreview"; } <div id="@previewToolbarId" style="text-align:center; height:auto; width:auto;"> <video id=@videoid controls preload="auto"> <source src="@(Url.Action("Download", "BinaryFiles", new {area = "EleWise.ELMA.SDK.Web", id = Model.File.Uid}))" type=’video/mp4’ /> <p>@SR.T("Чтобы воспроизвести данный файл удостоверьтесь, что ваш браузер поддерживает HTML5")</p> </video> </div> <script type="text/javascript"> $(’#btnPrint’).next().remove(); $(’#btnPrint’).remove(); var video = document.getElementById("@videoid"); function @(closePreviewFunc)() { video.pause(); } </script>
Предпросмотр документов доступен не только в карточке документов, но и повсеместно в системе, например, при нажатии на документ в ленте сообщений. В этом случае Вам будет предложено открыть документ прямо в браузере и документ откроется в popup-окне. В этом popup-окне будут убраны 2 кнопки: распечатать и полный экран, а также реализована остановка видео при закрытии popup-окна.
С помощью данного примера можно реализовать воспроизведение аудиофайлов, для этого в представлении необходимо заменить тег video на тег audio,а также заменить поддерживаемый точкой расширения формат файла. Подробнее о поддерживаемых аудио и видео форматах, а также о поддержке браузеров Вы можете прочитать здесь и здесь.
Ссылки на элементы API
IFilePreviewCreator (для версий 3.13, 3.15, 4.0)
IFilePreviewCreatorRenderer (для версий 3.13)