Описание
Компонент flexberry-file предоставляет несколько возможностей:
- Возможность выбора пользователем какого-либо файла на клиентском устройстве;
- Возможность загрузки этого файла на сервер;
- Возможность скачивания ранее загруженного файла с сервера, с последующим сохранением на клиентском устройстве;
- Для файлов изображений также имеется возможность их предпросмотра;
Общий вид компонента, в случае, если текущая тема оформления “BlueSky”:

Компонент реализован под средства для работы с файлами имеющиеся в распоряжении OData-сервиса (читайте о них в статье “Особенности работы с файлами через OData-сервис”).
Далее будем считать, что средства работы с файлами в OData-сервисе уже сконфигурированы, и файловый контроллер доступен по адресу <Адрес узла, на котором развернут OData-сервис>/api/File.
Список свойств
| Название свойства | Краткое описание |
|---|---|
uploadUrl |
Адрес для загрузки файлов на сервер |
maxUploadFileSize |
Максимальный возможноы размер загружаемого файла |
showPreview |
Флаг, показывающий нужно ли отображать блок предпросмотра |
showUploadButton |
Флаг, показывающий нужно ли отображать отдельную кнопку загрузки файла на сервер |
showDownloadButton |
Флаг, показывающий нужно ли отображать отдельную кнопку скачивания файла с сервера |
showModalDialogOnUploadError |
Флаг, показывающий нужно ли показывать модальнй диалог при ошибке загрузки файла |
showModalDialogOnDownloadError |
Флаг, показывающий нужно ли показывать модальнй диалог при ошибке выгрузки файла |
openFileInNewWindowInsteadOfLoading |
Флаг, показывающий нужно ли откывать файл в новой вкладке браузера после скачивания |
previewSettings |
Настройки отображения модального окна предпросмотра изображений |
Настройка адреса для загрузки файлов на сервер
Чтобы компонент flexberry-file мог загружать файлы на сервер, ему нужно, как минимум, знать URL для загрузки, под этот URL в компоненте предусмотрено свойство uploadUrl, в котором должен быть указан адрес файлового контроллера.
Свойство uploadUrl можно сконфигурировать двумя способами:
- Либо прямо в
hbs-шаблоне:{{flexberry-file uploadUrl="<Адрес узла, на котором развернут OData-сервис>/api/File" }} - Либо в конфигурационном файле приложения
config/environment.js(чтобы не указывать его каждый раз, когда используем компонент):{ ... APP: { ... components: { flexberryFile: { uploadUrl: '<Адрес узла, на котором развернут OData-сервис>/api/File' } } ... } ... }
Файловое свойство в ember-моделях и привязка компонента к нему
Когда мы запрашиваем у OData-сервиса объект данных, содержащий в себе какое-либо файловое свойство, в качестве значения этого свойства OData-сервис всегда присылает не сам файл (т.к. вычитка объектов данных вместе с файлами длилась бы очень долго), а только сериализованное метаописание файла, которое имеет следующий вид:
{
// URL для скачивания файла.
"fileUrl":"<Адрес узла, на котором развернут OData-сервис>/api/File?...",
// URL для скачивания preview (если файл это изображение).
"previewUrl":"<Адрес узла, на котором развернут OData-сервис>/api/File?...&getPreview=true",
// Наименование файла.
"fileName":"image.png",
// Размер файла в байтах.
"fileSize": 12345,
// MIME-тип файла.
"fileMimeType": "image/png"
}
Т.к. метаописание приходит сериализованным, т.е. строкой, то с точки зрения ember-а оно совершенно ничем не отличается от любого другого строкового свойства типа string, однако в аддоне ember-flexberry-data под него все-таки сделана специальная трансформация file, для того чтобы файловые свойства можно было отличать от остальных (таким образом, например, компонент flexberyy-groupedit понимает, что для работы со свойством такого типа нужно встраивать компонент flexberry-file, а не просто flexberry-textbox).
Поэтому в ember-моделях файловые свойства описываются следующим образом:
export default BaseModel.extend({
myFileProperty: DS.attr('file')
});
Компонент flexberry-file принимает это метаописание в качестве значения свойства value, т.е. если метаописание файла находится в модели в свойстве myFileProperty, то привязка будет выглядеть следующим образом:
{{flexberry-file
relatedModel=model
value=model.myFileProperty
}}
Свойство relatedModel так же необходимо указывать, оно должно ссылаться на модель, в которой содержится файловое свойство, чтобы при сохранении модели компонент flexberry-file смог сначала загрузить на сервер выбранный пользователем файл (если такой имеется).
Настройки внешнего вида
Компонент flexberry-file содержит несколько настроек позволяющих настраивать его внешний вид:
-
showUploadButton- флаг, показывающий нужно ли отображать отдельную кнопку загрузки файла на сервер или нет (по умолчанию имеет значениеfalseт.к. загрузка файла происходит при сохранении модели из свойстваrelatedModelи потребности в отдельной кнопке - нет).Внешний вид с включенной кнопкой загрузки:

-
showDownloadButton- флаг, показывающий нужно ли отображать отдельную кнопку скачивания файла с сервера или нет (по умолчанию имеет значениеtrue).Внешний вид с выключенной кнопкой скачивания:

-
readonly- флаг, показывающий находится ли компонент в режиме только для чтения (по умолчанию имеет значениеfalse). В этом режиме скрыты кнопки выбора файла, удаления файла, загрузки файла на сервер, и нет возможности изменить или удалить файл, есть только возможность его скачать.Внешний вид в режиме только для чтения:

-
showPreview- флаг, показывающий нужно ли отображать блок предпросмотра (по умолчанию имеет значениеfalse, настройка актуальна для файлов изображений, в случае с файлами других типов блок предпросмотра будет пустым).Внешний вид с включенным блоком предпросмотра:

Если нажать блок предпросмтора, то будет открыт модальный диалог, в котором выбранный фал изображения будет отображен в своих реальных размерах без сжатия:

За открытие диалога отвечает
actionflexberryFileViewImageAction, который уже реализован в базовом контроллере форм редактирования, но если зачем-то захочется его переопределить, или выполнять какие-то другие действия по нажатию на блок предпросмотра, можно задать свойactionчерез свойство компонентаviewImageAction:{{flexberry-file ... showPreview=true viewImageAction="flexberryFileViewImageAction" }} -
previewSettings- настройки отображения модального окна предпросмотра изображений (по умолчанию {}, настраивает отображение модального окна предпросомтра загруженных файлов)./** Settings for preview modal dialog. @property previewSettings @type Object */ previewSettings: { detachable: true, context: 'body', },{{flexberry-file ... showPreview=true viewImageAction="flexberryFileViewImageAction" previewSettings=previewSettings }}Если нажать блок предпросмтора, то будет открыт модальный диалог, который привязан к body.
Работа с файлами в формате base64
Компонент flexberry-file имеет возможность работы с файлами в формате base64.
Для этого необходимо задать компоненту несколько параметров:
{{flexberry-file
...
base64Value=base64String
base64FileName="test"
base64FileExtension="jpg"
}}
base64Value - параметр, в котором должна содержаться строка в формате base64. При изменении значения base64Value и успешной обработки в файловом контроле, переменной присваивается значение null. Это связано со спецификой файлового контрола и необходимо для ситуаций, когда пользователь захочет прикрепить/заменить файл, выбранный из файловой системы после использования base64Value.
base64FileName и base64FileExtension атрибуты для имени создаваемого и загружаемого на сервер файла.
Имя будет выглядеть, как :
`{base64FileName}.{base64FileExtension}`
Для отображения модального окна ошибок, при обработке base64 файлов, необходимо присвоить параметру showModalDialogOnUploadError значение true.
Настройки внешнего вида в мобильном представлении
Компонент flexberry-file имеет специальное представление для мобильных устройств.
В этом представлении компонент, в котором пользователем еще не выбран файл, выглядит как кнопка с надписью “Добавить файл” (эту надпись можно кастомизировать задав её через свойство addButtonText компонента):

Когда пользователь выбрал какой-либо файл, компонент выглядит уже как кнопка с выпадающим меню и пунктами для замены файла, его загрузки, скачивания, и в случае, если файл является изображением, его увеличения:
