Хранение файлов в базе данных

В этом разделе приводится пример загрузки и сохранения изображений в базу данных приложения, а также описывается, как можно отображать изображения на экранах UI.

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

Во-первых, создайте атрибут типа байтового массива (byte[]) в сущности, например:

@Column(name = "PHOTO")
private byte[] photo;

public byte[] getPhoto() {
    return photo;
}

public void setPhoto(byte[] photo) {
    this.photo = photo;
}

При запуске приложения Studio генерирует скрипт миграции базы данных для создания соответствующего столбца подходящего базе типа. Например, для PostgreSQL это bytea.

Для загрузки файла из экрана UI используйте компонент fileUploadField, привязанный к атрибуту сущности. Если файл является изображением, можно использовать компонент image для его отображения на экране. Например:

<formLayout id="form" dataContainer="personDc">
    <textField id="nameField" property="name"/>
    <vbox>
        <hbox>
            <fileUploadField id="photoField" property="photo"/> (1)
            <button id="downloadBtn" text="Download"/>
        </hbox>
        <image id="image" dataContainer="personDc" property="photo"/> (2)
    </vbox>
</formLayout>
1 Компонент fileUploadField позволяет пользователям загружать файл и сохранять его в атрибуте сущности.
2 Компонент image отображает содержимое атрибута сущности.

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

@ViewComponent
private InstanceContainer<Person> personDc;

@Autowired
private Downloader downloader; (1)

@Subscribe("downloadBtn")
public void onDownloadBtnClick(final ClickEvent<Button> event) {
    byte[] photo = personDc.getItem().getPhoto();
    downloader.download(
            photo,
            personDc.getItem().getName() + "photo", (2)
            DownloadFormat.JPG (3)
    );
}
1 Используйте бин Downloader для скачивания файлов.
2 Определите имя скачанного файла.
3 Если вы знаете формат файла, укажите его в последнем аргументе метода download(). В зависимости от формата веб-браузер будет либо скачивать файл, либо отображать его во вкладке.