Начиная с версии 7.17.2 ядро Creatio предоставляет набор классов и интерфейсов по работе с файлами:
- пространство имен Terrasoft.File.Abstractions — интерфейсы и абстрактные классы, описывающие логику работы с файлами в Creatio.
- пространство имен Terrasoft.File — конкретные реализации абстракций, использующиеся в системе.
Местоположение файла и файловые локаторы
Местоположение файла в файловом хранилище задается с помощью файлового локатора — объекта, который реализует интерфейс Terrasoft.File.Abstractions.IFileLocator.
Файловый локатор обязательно содержит уникальный идентификатор файла RecordId.
Можно создавать разные реализации файловых локаторов для различных файловых хранилищ. В зависимости от специфики хранилища файловый локатор может содержать дополнительные свойства, позволяющие определить место хранения файла. Например, класс Terrasoft.File.EntityFileLocator — это реализация файлового локатора для текущего файлового хранилища Creatio Файлы и ссылки (Attachments). Объект класса EntityFileLocator, кроме свойства RecordId, имеет свойство EntitySchemaName — имя схемы объекта, в котором хранится файл, например: "ActivityFile" или "CaseFile".
Все методы по работе с файлами оперируют с файловыми локаторами.
Файлы и файловые хранилища
Структура файла в Creatio:
- метаданные файла;
- контент файла.
Метаданные описывают свойства файла:
- имя;
- размер в байтах;
- дата создания и т. п.
Основой для метаданных файла является абстрактный класс Terrasoft.File.Abstractions.Metadata.FileMetadata. Примером его конкретной реализации является класс Terrasoft.File.Metadata.EntityFileMetadata для описания метаданных файлов в объекте Файлы и ссылки (Attachments).
Контент — это непосредственно содержимое файла.
Метаданные файла и его контент хранятся в Creatio в разных хранилищах:
- Хранилище метаданных файлов должно реализовывать интерфейс Terrasoft.File.Abstractions.Metadata.IFileMetadataStorage.
- Хранилище контента файла должно реализовывать интерфейс Terrasoft.File.Abstractions.Metadata.IFileContentStorage.
Конкретные реализации этих интерфейсов скрывают в себе нюансы взаимодействия с различными системами хранения файлов: Файлы и ссылки (Attachments) Creatio, файловая система сервера, Amazon S3, Google Drive и т. п.
Интерфейс Terrasoft.File.Abstractions.IFile предоставляет необходимые методы для работы с файлами, хранящимися в любых типах файловых хранилищ. Реализация этого интерфейса означает "файл" в терминах Creatio. Методы в этом интерфейсе обеспечивают асинхронную работу с файлами. Синхронные версии этих методов находятся в расширяющем классе Terrasoft.File.Abstractions.FileUtils.
Получить файл (IFileFactory)
Интерфейс Terrasoft.File.Abstractions.IFileFactory предоставляет методы для создания и получения объектов некоторого класса, реализующего интерфейс Terrasoft.File.Abstractions.IFile. Этот интерфейс реализует фабрика, доступ к которой обеспечивается через методы класса Terrasoft.File.FileFactoryUtils, расширяющего класс UserConnection. Соответственно, для успешной работы с файлами необходимо иметь экземпляр UserConnection или SystemUserConnection.
Место хранения нового или существующего файла однозначно определяется его файловым локатором. Для получения доступа к существующему файлу необходимо знать его уникальный идентификатор RecordId. Для нового файла этот идентификатор формируется самостоятельно и передается в метод по созданию локатора.
Реализовать и зарегистрировать новый тип файлового хранилища
Для реализации нового типа файлового хранилища необходимо:
- Создать свою реализацию интерфейса Terrasoft.File.Abstractions.Content.IFileContentStorage, который описывает необходимое API для работы с хранилищем файлового контента.
- Если текущее хранилище метаданных файлов (Terrasoft.File.Metadata.EntityFileMetadataStorage) по каким-то причинам не подходит, необходимо реализовать собственное хранилище метаданных, свой тип метаданных и свой тип файлового локатора:
- Хранилище данных должно реализовывать интерфейс Terrasoft.File.Abstractions.Metadata.IFileMetadataStorage.
- Файловый локатор должен реализовывать интерфейс Terrasoft.File.Abstractions.IFileLocator.
- Класс метаданных должен быть наследником абстрактного класса Terrasoft.File.Abstractions.Metadata.FileMetadata.
- Новые хранилища контента и метаданных файлов необходимо зарегистрировать в соответствующих справочниках "SysFileContentStorage" и "SysFileMetadataStorage".
Исключения при работе с файлами
Тип исключения |
Сообщение |
Условия возникновения |
---|---|---|
Terrasoft.File.Abstractions. |
File not found by locator '{тип_локатора}{локатор.ToString}' |
При доступе к любому из свойств или методов интерфейса IFile, если метаданные файла не найдены. |
System.InvalidOperationException | Can't delete new file: '{тип_локатора}, {локатор.ToString}' | При попытке удаления только что созданного файла: FileMetadata.StoringState == FileStoringState.New |
Terrasoft.Common.NullOrEmptyException | File name cannot be null or empty | При попытке сохранения файла с пустым полем Name |
System.InvalidOperationException | Can't find a metadata storage for the '{тип_локатора}' locator type |
Если подходящее по типу локатора хранилище метаданных файла не найдено |
System.InvalidOperationException | Can't find a content storage for the '{тип_метаданных}' metadata type | Если подходящее по типу метаданных хранилище контента файла не найдено. |
Настройка активного хранилища
Настройка активного хранилища происходит путем установки значения системной настройки Активное хранилище содержимого файлов (код "ActiveFileContentStorage").
Пространство имен Terrasoft.File.Abstractions.
Интерфейс Terrasoft.File.Abstractions.IFile предоставляет необходимые методы для работы с файлами, хранящимися в любых типах файловых хранилищ. Методы этого интерфейса обеспечивают асинхронную работу с файлами. Синхронные версии этих методов находятся в расширяющем классе Terrasoft.File.Abstractions.FileUtils.
Свойства
Файловый локатор, который связан с текущим экземпляром класса, реализующего интерфейс IFile.
Имя файла.
Размер текущего файла в байтах.
Дата и время создания текущего файла.
Дата и время модификации текущего файла.
Показывает существует ли текущий файл.
Методы
Ассинхронно копирует текущий файл в новый target.
Асинхронно перемещает текущий файл в новый target.
Асинхронно удаляет текущий файл.
Асинхронно записывает содержимое текущего файла в поток stream.
Асинхронно считывает содержимое текущего файла.
Асинхронно сохраняет метаданные текущего файла.
Устанавливает значение value атрибута name для текущего файла.
Возвращает значение defaultValue атрибута name либо значение по умолчанию для текущего файла.
Пространство имен Terrasoft.File.Abstractions.
Интерфейс Terrasoft.File.Abstractions.IFileContentStorage предоставляет необходимые методы для работы с хранилищем контента файла.
Пространство имен Terrasoft.File.Abstractions.
Интерфейс Terrasoft.File.Abstractions.IFileFactory предоставляет набор методов для получения или создания экземпляра класса, реализующего интерфейс Terrasoft.File.Abstractions.IFile.
Пространство имен Terrasoft.File.
Класс предоставляет реализацию интерфейса IFileLocator для текущего файлового хранилища Creatio.
Пространство имен Terrasoft.File.
Класс Terrasoft.File.EntityFileMetadata реализует абстрактный класс Terrasoft.File.Abstractions.Metadata.FileMetadata. Этот класс описывает метаданные файлов в объекте Файлы и ссылки (Attachments) и предоставляет методы для работы с ними.
Пространство имен Terrasoft.File.
Класс Terrasoft.File.FileFactoryUtils предоставляет расширяющие методы класса UserConnection и класса-фабрики, реализующего интерфейс Terrasoft.File.AbstractionsIFileFactory. Таким образом класс обеспечивает доступ к фабрике создания новых или получения существующих файлов. Соответственно, для успешной работы с файлами необходимо иметь экземпляр UserConnection или SystemUserConnection.
Методы
Расширяющий метод класса UserConnection, который возвращает экземпляр класса, реализующего интерфейс IFileFactory.
Расширяющий метод класса UserConnection, который возвращает экземпляр класса, реализующего интерфейс IFile из определенного файлового локатора fileLocator.
Расширяющий метод класса UserConnection, который создает новый экземпляр класса, реализующего интерфейс IFile для определенного файлового локатора fileLocator.
Расширяющий метод класса, реализующего интерфейс IFileFactory. Возвращает экземпляр класса, реализующего интерфейс IFile для определенного файлового локатора fileLocator.
Расширяющий метод класса, реализующего интерфейс IFileFactory. Создает новый экземпляр класса, реализующего интерфейс IFile для определенного файлового локатора fileLocator.
Расширяющий метод класса, реализующего интерфейс IFileFactory. Возвращает экземпляр класса, реализующего интерфейс IFileFactory, настроенного без учета прав пользователя.
Пространство имен Terrasoft.File.Abstractions.Metadata.
Абстрактный класс Terrasoft.File.Abstractions.Metadata.FileMetadata предоставляет свойства метаданных файла и методы для работы с метаданными.
Свойства
Имя файла.
Размер файла в байтах.
Дата и время создания файла.
Дата и время изменения файла.
Идентификатор хранилища контента файла.
Состояние файла ("Новый", "Изменен", "Неизменен", "Удален").
Методы
Устанавливает для файла дополнительный значение value дополнительного аттрибута name.
Возвращает установленное значение либо значение по умолчанию defaultValue определенного дополнительного аттрибута name.
Устанавливает состояние файла FileStoringState.Modified если предыдущее состояние не равно FileStoringState.New.
Пространство имен Terrasoft.File.Abstractions.
Класс Terrasoft.File.Abstractions.FileUtils предоставляет расширяющие методы для работы с файлами.
Методы
Устанавливает для файла значения аттрибутов, переданных в коллекции attributes.
Сохраняет метаданные файла.
Считывает содержимое файла.
Записывает содержимое файла.
source | Файл, содержимое которого необходимо записать. |
stream | Поток, предоставляющий содержимое файла. |
writeOptions | Параметры для записи файла. |
content | Содержимое файла в виде массива байтов. |
Удаляет определенный файл.
Копирует существующий файл source в новый target.
Перемещает существующий файл source в новое место target.