历史版本33 :文件上传至数据库并下载 返回文档
编辑时间: 内容长度:图片数:目录数: 修改原因:

目录:

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数据库,不支持文件下载。


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(len(filename(C2)) = 6, B2, filename(C2))。公式的含义为:当文件控件未上传文件时,直接取数据库中的文件名,否则则使用filename()函数获取上传的文件名。

2)如果有插入行需求,那么需要选中 D2 单元格,设置「单元格属性>其他>插入行策略」为原值,否则插入的行的公式会失效。

3)在报表填报属性中添加内置SQL,绑定列和值,如下图所示:

4)隐藏B列和D列。

2.4 下载设置

选中 C2 单元格,设置单元格的其他>显示内容用下载链接显示二进制内容,并设置下载文件名」为=B2如下图所示:

注:下载文件名处为必填项,不填会下载 txt 或者 zip 包之类的乱码文件下来。


2.5 效果预览

保存模板,点击填报预览。在C2单元格可完成文件的上传和下载,并支持重新上传文件覆盖之前保存的文件。如下图所示:

1.gif

数据库中保存的数据如图所示:


3. 模板下载编辑