Загрузка файлов
В этом разделе объясняется, как загружать файлы с компьютера пользователя с помощью компонентов пользовательского интерфейса. Сведения о том, как загружать файлы через 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()
.