4.5.2.1.8. FileUploadField
Компонент FileUploadField
позволяет пользователю загружать файлы на сервер. Компонент представляет собой кнопку, при нажатии на которую на экране отображается стандартное для операционной системы окно, в котором можно выбрать один файл. Чтобы дать пользователю возможность загружать сразу несколько файлов, используйте компонент FileMultiUploadField.

XML-имя компонента: upload
.

Компонент реализован для блоков Web Client и Desktop Client.
Рассмотрим пример использования компонента.
-
Объявляем компонент в XML-дескрипторе экрана:
<upload id="uploadField" caption="msg://upload"/>
-
В контроллере экрана инжектируем сам компонент, а также интерфейсы FileUploadingAPI и DataSupplier. Затем в методе
init()
добавляем слушатели, которые будут реагировать на события успешной загрузки или ошибки:@Inject private FileUploadField uploadField; @Inject private FileUploadingAPI fileUploadingAPI; @Inject private DataSupplier dataSupplier; @Override public void init(Map<String, Object> params) { uploadField.addFileUploadSucceedListener(event -> { FileDescriptor fd = uploadField.getFileDescriptor(); try { // save file to FileStorage fileUploadingAPI.putFileIntoStorage(uploadField.getFileId(), fd); } catch (FileStorageException e) { throw new RuntimeException("Error saving file to FileStorage", e); } // save file descriptor to database dataSupplier.commit(fd); showNotification("Uploaded file: " + uploadField.getFileName(), NotificationType.HUMANIZED); }); uploadField.addFileUploadErrorListener(event -> showNotification("File upload error", NotificationType.HUMANIZED)); }
Компонент загружает файл во временное хранилище клиентского уровня и вызывает листенер, добавленный методом
addFileUploadSucceedListener()
. В этом листенере у компонента запрашивается объектFileDescriptor
, соответствующий загруженному файлу. Объектcom.haulmont.cuba.core.entity.FileDescriptor
(не путать сjava.io.FileDescriptor
) является персистентной сущностью, которая однозначно идентифицирует загруженный файл и впоследствии используется для выгрузки файла из системы.Метод
FileUploadingAPI.putFileIntoStorage()
используется для перемещения загружаемого файла из временного хранилища клиентского уровня в FileStorage. Параметрами этого метода являются идентификатор файла во временном хранилище и объектFileDescriptor
. Оба эти параметра предоставляетFileUploadField
.После загрузки файла в
FileStorage
выполняется сохранение экземпляраFileDescriptor
в базе данных посредством вызоваDataSupplier.commit()
. Возвращаемый этим методом сохраненный экземпляр может быть установлен в атрибут какой-либо сущности предметной области, связанной с данным файлом. В данном же случаеFileDescriptor
просто сохраняется в базе данных. Соответствующий файл будет доступен через экран Administration → External Files.Листенер, добавленный методом
addFileUploadErrorListener()
вызывается в случае ошибки загрузки файла во временное хранилище клиентского уровня. -
Максимальный размер загружаемого файла определяется свойством приложения cuba.maxUploadSizeMb и по умолчанию равен 20MB. При выборе пользователем файла большего размера выдается соответствующее сообщение и загрузка прерывается.
-
XML-атрибут
accept
(и соответствующий методsetAccept()
) может быть использован для установки маски расширений файлов в диалоге выбора файла. Значением атрибута должен быть список масок, разделенных запятыми. Например:*.jpg,*.png
.
В разделе Загрузка и вывод изображений приведен более сложный пример работы с загруженными файлами.