Загрузка файлов

В этом разделе объясняется, как загружать файлы с компьютера пользователя с помощью компонентов пользовательского интерфейса. Сведения о том, как загружать файлы через REST API, см. в разделе Files API.

Компоненты загрузки файлов

Jmix предлагает набор UI-компонентов для загрузки файлов. Все они содержат кнопку, которая при нажатии открывает диалоговое окно файловой системы для выбора файлов. Вот краткий обзор различий между компонентами. Более подробная информация о каждом компоненте приведена в соответствующих разделах.

  • fileUploadField позволяет пользователям выбрать один файл и сохранить его в виде массива байтов в атрибут сущности. Пользователи также могут получить доступ к содержимому файла напрямую из значения компонента, не связывая его с сущностью.

  • fileStorageUploadField позволяет пользователям выбрать один файл и сохранить его в файловом хранилище. Значение компонента - объект FileRef. Пользователи могут связать компонент с атрибутом сущности типа FileRef, чтобы автоматически сохранять ссылку на файл в базу данных.

  • upload позволяет пользователям загружать один или несколько файлов одновременно. Он предоставляет основу для обработки загрузки файлов, но не взаимодействует непосредственно с сущностями или системами хранения.

Использование TemporaryStorage

Компонент fileStorageUploadField имеет атрибут fileStoragePutMode со значением по умолчанию IMMEDIATE. Если установить его в MANUAL, компонент загружает файл во временное хранилище в файловой системе приложения и дает вам полный контроль над загруженным файлом. Его можно передать в файловое хранилище как есть, предварительно обработать его, а также сделать все, что вам нужно, вообще не сохраняя его в файловом хранилище.

Интерфейс TemporaryStorage предоставляет API для создания временных файлов, сохранения их в хранилище файлов или их удаления.

Ниже приведен пример использования fileStorageUploadField в ручном режиме для переноса загруженного файла из временного в файловое хранилище.

<fileStorageUploadField id="fileField" fileStoragePutMode="MANUAL"/>
@ViewComponent
private FileStorageUploadField fileField;

@Autowired
private TemporaryStorage temporaryStorage;

@Subscribe("fileField")
public void onFileFieldFileUploadSucceeded(final FileUploadSucceededEvent<FileStorageUploadField> event) {
    if (event.getReceiver() instanceof FileTemporaryStorageBuffer buffer) {
        UUID fileId = buffer.getFileData().getFileInfo().getId();
        File file = temporaryStorage.getFile(fileId); (1)
        if (file != null) {
            FileRef fileRef = temporaryStorage.putFileIntoStorage(fileId, event.getFileName()); (2)
            fileField.setValue(fileRef);
        }
    }
}
1 Получение локального файла из временного хранилища, используя идентификатор, предоставляемый объектом события.
2 Перенос локального файла в файловое хранилище.

Метод putFileIntoStorage() также удаляет временный локальный файл.

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

File file = temporaryStorage.getFile(fileId);
if (file != null) {
    processFile(file);
    temporaryStorage.deleteFile(fileId);
}

Во временном хранилище накапливаются файлы, которые по разным причинам не были удалены. Поэтому он предоставляет JMX-интерфейс для удаления старых неиспользуемых файлов.

У MBean есть метод clearTempDirectory(), который удаляет все файлы старше 2 дней из временного каталога приложения (.jmix/temp по умолчанию). Вы можете вызывать этот метод вручную или периодически использовать задание Quartz. Для этого в задании нужно внедрить компонент TemporaryStorageManagementFacade и вызвать его метод clearTempDirectory().