4.5.2.1.7. FileMultiUploadField

Компонент 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 просто хранится в системе и дает доступ к файлу через экран Administration > External Files.

    После обработки файлов необходимо очистить список файлов вызовом clearUploads() на случай повторной загрузки.

  • Максимальный размер загружаемого файла определяется свойством приложения cuba.client.maxUploadSizeMb и по умолчанию равен 20Мб. При выборе пользователем файла большего размера выдается соответствующее сообщение и загрузка прерывается.

Атрибуты multiUpload: