1. 概述
1.1 应用场景
希望直接将 txt、Excel 等小型文件保存在数据库中,并且在报表中将这些文件下载下来。
1.2 实现思路
「文件控件」上传文件,设置好填报属性,以二进制流保存至数据库字段中(字段类型必须是可以存二进制数据的)
使用每种数据库可以存文件的字段类型是不同的,以下列出常用数据库保存二进制数据的字段类型:
数据库 | 用于保存二进制数据的字段类型 |
---|---|
Sql Sever | image |
Oracle | blob |
MySQL | longblob |
Access | OLE对象 注:Access需使用ODBC连接,方可实现上传下载 |
「其他>显示内容」为「用下载链接显示二进制内容」,就可以实现下载。
1.3 注意事项
1)本文档适用于上传单文件场景,如果在同一条数据中上传多个文件,入库后会出现只保存了一个文件的情况。如有多文件上传需求,可考虑增加uuid字段用于区分同一条数据中的多个文件。
2)本文档适用于小文件的上传下载,文件过大会占用过多的数据库表空间。如有大文件上传需求,建议使用:上传下载文件插件
3)设计器自带的FRDemo所使用的sqlite数据库,不支持文件下载。
4)该方案不支持移动端。
5)出于安全考虑,需要登录决策平台账号后才可以下载文件
2. 示例
2.1 数据准备
1)在MYSQL数据库中创建一张数据库表「文件」,包含字段(id[int]、file[longblob]、name[varchar])。如图所示:
2)新建数据集ds1,从刚才的MYSQL数据库取数,sql语句为:SELECT * FROM `文件`
2.2 模板设计
如图设计模板,A2单元格为文本控件,C2单元格为文件控件。
C2单元格的文件控件需勾选「只支持单文件上传」。
2.3 上传设置
1)在D2单元格插入公式:=if(left(filename(C2)) = '#', B2, filename(C2))。公式的含义为:当文件控件未上传文件时,直接取数据库中的文件名,否则则使用filename()函数获取上传的文件名。
2)如果有插入行需求,那么需要选中 D2 单元格,设置「单元格属性>其他>插入行策略」为原值,否则插入的行的公式会失效。
3)在报表填报属性中添加内置SQL,绑定列和值,如下图所示:
4)隐藏B列和D列。
2.4 下载设置
选中 C2 单元格,设置单元格的「其他>显示内容」为「用下载链接显示二进制内容」,并设置「下载文件名」为=B2,如下图所示:
注:下载文件名处为必填项,不填会下载 txt 或者 zip 包之类的乱码文件下来。
2.5 效果预览
保存模板,点击「填报预览」。在C2单元格可完成文件的上传和下载,并支持重新上传文件覆盖之前保存的文件。如下图所示:
数据库中保存的数据如图所示:
3. 模板下载
点击下载模板:文件上传至数据库并下载.cpt