Компонент FileMultiUploadField
позволяет пользователю загружать файлы на сервер. Компонент представляет собой кнопку, при нажатии на которую на экране отображается
стандартное для операционной системы окно выбора файлов, в котором можно выбрать сразу несколько файлов для загрузки.
XML-имя компонента: multiUpload
.
Компонент реализован для блоков Web Client и Desktop Client. Для работы веб-версии компонента необходима поддержка браузером технологии Flash.
Рассмотрим пример использования компонента.
-
Объявляем компонент в XML-дескрипторе экрана:
<multiUpload id="multiUploadField" caption="msg://upload"/>
-
В контроллере экрана инжектируем сам компонент, а также интерфейсы FileUploadingAPI и DataSupplier. Затем в методе
init()
добавляем компоненту слушатель, который будет реагировать на события успешной загрузки или ошибки:@Inject protected FileMultiUploadField multiUploadField; @Inject protected FileUploadingAPI fileUploading; @Inject protected DataSupplier dataSupplier; @Override public void init(Map<String, Object> params) { multiUploadField.addListener(new FileMultiUploadField.UploadListener() { @Override public void queueUploadComplete() { Map<UUID, String> uploadMap = multiUploadField.getUploadsMap(); for (Map.Entry<UUID, String> entry : uploadMap.entrySet()) { UUID fileId = entry.getKey(); String fileName = entry.getValue(); FileDescriptor fd = fileUploading.getFileDescriptor(fileId, fileName); // save file to FileStorage try { fileUploading.putFileIntoStorage(fileId, fd); } catch (FileStorageException e) { new RuntimeException(e); } // save file descriptor to database dataSupplier.commit(fd, null); } multiUploadField.clearUploads(); } }); }
Метод
queueUploadComplete()
будет вызван компонентом после успешной загрузки всех выбранных файлов во временное хранилище клиентского уровня. В этот момент вызовом методаgetUploadsMap()
у компонента можно получить мэп идентификаторов файлов во временном хранилище на имена файлов. Далее по этим данным для каждого файла создается соответствующий объектFileDescriptor
. Объектcom.haulmont.cuba.core.entity.FileDescriptor
(не путать сjava.io.FileDescriptor
) является персистентной сущностью, которая однозначно идентифицирует загруженный файл и впоследствии используется для выгрузки файла из системы.Метод
FileUploadingAPI.putFileIntoStorage()
используется для перемещения загружаемого файла из временного хранилища клиентского уровня в FileStorage. Параметрами этого метода являются идентификатор файла во временном хранилище и объектFileDescriptor
.После загрузки файла в
FileStorage
выполняется сохранение экземпляраFileDescriptor
в базе данных посредством вызоваDataSupplier.commit()
. Возвращаемый этим методом сохраненный экземпляр может быть установлен в атрибут какой-либо сущности предметной области, связанной с данным файлом. В данном же случаеFileDescriptor
просто хранится в системе и дает доступ к файлу через экран > .После обработки файлов необходимо очистить список файлов вызовом
clearUploads()
на случай повторной загрузки. -
Максимальный размер загружаемого файла определяется свойством приложения cuba.client.maxUploadSizeMb и по умолчанию равен 20Мб. При выборе пользователем файла большего размера выдается соответствующее сообщение и загрузка прерывается.
Атрибуты multiUpload
: