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
    protected FileUploadField uploadField;
    
    @Inject
    protected FileUploadingAPI fileUploading;
    
    @Inject
    protected DataSupplier dataSupplier;
    
    @Override
    public void init(Map<String, Object> params) {
    uploadField.addListener(new FileUploadField.ListenerAdapter() {
        @Override
        public void uploadSucceeded(Event event) {
            FileDescriptor fd = uploadField.getFileDescriptor();
            try {
                // save file to FileStorage
                fileUploading.putFileIntoStorage(uploadField.getFileId(), fd);
            } catch (FileStorageException e) {
                throw new RuntimeException(e);
            }
            // save file descriptor to database
            dataSupplier.commit(fd, null);
    
            showNotification("File uploaded: " + uploadField.getFileName(), NotificationType.HUMANIZED);
        }
    
        @Override
        public void uploadFailed(Event event) {
            showNotification("File upload error", NotificationType.HUMANIZED);
        }
    });
    }

    Метод uploadSucceeded() будет вызван компонентом после успешной загрузки файла во временное хранилище клиентского уровня. В этот момент у компонента можно получить объект FileDescriptor, соответствующий загруженному файлу. Объект com.haulmont.cuba.core.entity.FileDescriptor (не путать с java.io.FileDescriptor) является персистентной сущностью, которая однозначно идентифицирует загруженный файл и впоследствии используется для выгрузки файла из системы.

    Метод FileUploadingAPI.putFileIntoStorage() используется для перемещения загружаемого файла из временного хранилища клиентского уровня в FileStorage. Параметрами этого метода являются идентификатор файла во временном хранилище и объект FileDescriptor. Оба эти параметра предоставляет FileUploadField.

    После загрузки файла в FileStorage выполняется сохранение экземпляра FileDescriptor в базе данных посредством вызова DataSupplier.commit(). Возвращаемый этим методом сохраненный экземпляр может быть установлен в атрибут какой-либо сущности предметной области, связанной с данным файлом. В данном же случае FileDescriptor просто хранится в системе и дает доступ к файлу через экран Administration > External Files.

    Метод uploadFailed() вызывается компонентом FileUploadField в случае ошибки загрузки файла во временное хранилище клиентского уровня.

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

Атрибуты upload: