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