3.9.8.1. Загрузка файлов
Для загрузки файлов с компьютера пользователя в хранилище следует использовать компоненты FileUpload и FileMultiUpload. Примеры использования приведены в описании компонентов.
Руководство Working with Images in CUBA applications содержит примеры, демонстрирующие, как загружать изображения. |
Компонент FileUpload
также можно использовать в готовом диалоговом окне FileUploadDialog
, позволяющем загружать файлы в промежуточное хранилище.
Диалоговое окно FileUploadDialog
предоставляет базовую функциональность загрузки файлов в промежуточное хранилище. Оно содержит drop zone для перетаскивания файлов извне браузера и кнопку загрузки файла.
Данный диалог можно использовать следующим образом:
@Inject
private Screens screens;
@Inject
private FileUploadingAPI fileUploadingAPI;
@Inject
private DataManager dataManager;
@Subscribe("showUploadDialogBtn")
protected void onShowUploadDialogBtnClick(Button.ClickEvent event) {
FileUploadDialog dialog = (FileUploadDialog) screens.create("fileUploadDialog", OpenMode.DIALOG);
dialog.addCloseWithCommitListener(() -> {
UUID fileId = dialog.getFileId();
String fileName = dialog.getFileName();
File file = fileUploadingAPI.getFile(fileId); (1)
FileDescriptor fileDescriptor = fileUploadingAPI.getFileDescriptor(fileId, fileName); (2)
try {
fileUploadingAPI.putFileIntoStorage(fileId, fileDescriptor); (3)
dataManager.commit(fileDescriptor); (4)
} catch (FileStorageException e) {
throw new RuntimeException(e);
}
});
screens.show(dialog);
}
1 | - получение объекта java.io.File , указывающего на файл в файловой системе блока Web Client. Это может потребоваться, если вам нужно как-то обработать файл, а не просто поместить его в хранилище. |
2 | - создание сущности FileDescriptor . |
3 | - загрузка файла в хранилище среднего слоя. |
4 | - сохранение сущности FileDescriptor . |
В случае успешной загрузки диалог закрывается с COMMIT_ACTION_ID
, поэтому используйте CloseWithCommitListener
для получения результата загрузки. Чтобы получить UUID и имя загруженного файла, используйте методы getFileId()
и getFileName()
. Затем можно получить сам файл, а также, например, создать FileDescriptor
и загрузить файл в хранилище, или реализовать какую-либо другую логику.
Промежуточное хранилище клиентского уровня FileUploadingAPI
использует для хранения временных файлов каталог, заданный свойством приложения cuba.tempDir. Временные файлы удаляются автоматически в следующих случаях:
-
Для
FileUploadField
задан режимIMMEDIATE
. -
Используется метод
FileUploadingAPI.putFileIntoStorage(UUID, FileDescriptor)
.
В остальных случаях рекомендуется удалить файл, используя метод FileUploadingAPI.deleteFile(UUID)
.
Временные файлы могут оставаться в промежуточном хранилище в случае сбоев. Для удаления таких файлов служит метод clearTempDirectory()
бина cuba_FileUploading
. Этот метод периодически (в полночь вторника, четверга и субботы) вызывается шедулером, объявленным в файле cuba-web-spring.xml, и удаляет файлы старше 2-х дней.