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

Для загрузки файлов с компьютера пользователя в хранилище следует использовать компоненты FileUpload и FileMultiUpload. Примеры использования приведены в описании компонентов.

Руководство Working with Images in CUBA applications содержит примеры, демонстрирующие, как загружать изображения.

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

Диалоговое окно FileUploadDialog предоставляет базовую функциональность загрузки файлов в промежуточное хранилище. Оно содержит drop zone для перетаскивания файлов извне браузера и кнопку загрузки файла.

gui fileUploadDialog

Данный диалог можно использовать следующим образом:

@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-х дней.