文件保存至数据库

本章节中,我们提供一个上传和保存图片至应用程序数据库的示例。以及,介绍如何在 Jmix UI 视图中展示图片。

只在数据库保存小文件,例如,缩略图、图标等。因为在上传或下载时,整个文件都会加载到内存。

首先,为实体创建一个字节数组(byte[])类型的属性,示例:

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

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

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

当运行应用程序时,Studio 会生成一个数据库迁移脚本,用于创建适合你数据库类型的相应列。例如,对于 PostgreSQL,类型为 bytea

如需从用户界面上传文件,请使用 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 bean 下载文件。
2 定义下载后的文件名。
3 如果知道文件格式,可以在 download() 方法的最后一个参数指定。根据格式的不同,浏览器会下载文件或者在标签页展示。