LuBase低代码框架中所有的图片、文件等附件默认存储到本地磁盘,但是一些私有化部署的企业大多有私有云存储,那么如何扩展下对解决到外部存储呢?首先呢我们需要了解下LuBase低代码框架文件存储的原理,以下介介绍下LuBase框架文件存储涉及到的表及扩展方法。
一、系统文件如何存储的
系统内表单中图片字段、附件字段,以及通过调用文件上传接口上传的文件,物理文件默认采用的本地存储,通过配置文件custom.file-upload.storage-type属性进行位置的控制。
文件和数据之间的映射关系通过以下两张表存储,具体如下:
sd_file_info文件存储记录表:
列代码 | 字段含义 |
id | 主键id |
storage_service | 文件使用的服务,默认值是localFileStorageService |
file_path | 文件存储路径 |
file_name | 自动生成的不重复的文件名字 |
original_name | 文件原始的名字 |
file_size | 文件大小,单位是字节 |
ex_type | 文件扩展名 |
md5 | 文件唯一特征码。特征码相同的文件在此表不会重复存储 |
sd_file_relation 业务数据和文件的关系记录表
id | 主键id |
app_id | 预留字段,暂时无用 |
data_id | 附件对应的业务数据主键id |
data_column_tag | 附件对应的业务数据列的标识。因为一条业务数据可以有多个附件字段,通过data_column_tag来识别具体哪个附件字段存储的记录。 data_column_tag格式:业务数据表结构(dm_table)的主键id+英文逗号+业务数据列的code。例如:679613636607479808,img_key |
file_info_id | 外键字段,存储sd_file_info表主键id |
original_name | 文件原始的名字。 因同一特征码文件在sd_file_info只存储一次,但是在不同上传场景可能此文件名字不一样,所以此字段存储文件原始名字 |
二、如何扩展文件存储服务
如果需要对文件的存储进行扩展的话,可以通过实现FileStorageService接口,修改配置文件custom.file-upload.storage-type 为实现的服务名即可。此配置项不配置的默认值为:localFileStorageService。
-
public
interface FileStorageService {
-
/
**
-
* 将二进制文件流进行存储
-
*
-
* @param group 预留参数,暂时无用
-
* @param fileName 文件原始名字
-
* @param uniqueName 文件唯一名字,自动生成
-
* @param bs 文件流
-
* @return 文件存储路径
-
* @throws IOException
-
*/
-
String writeFile(
String
group,
String fileName,
String uniqueName, byte[] bs) throws IOException;
-
-
/
**
-
* 根据文件存储路径和文件名字读取文件
-
*
-
* @param filePath 文件路径
-
* @param fileName 文件原始名字
-
* @param uniqueName 文件唯一名字,在存储文件时生成的名字
-
* @return
-
*/
-
byte[] readFile(
String filePath,
String fileName,
String uniqueName);
-
}
-
在扩展FileStorageService服务时,无需手动存储sd_file_info和sd_file_relation两张表数据,会自动存储。
三、如何验证扩展的存储服务功能正常
最后附上测试用例,用以检查下您的扩展是否功能正常。以下罗列了部分测试用例,方便对新服务进行测试
序号 | 场景 | 期望 |
1 | 在同一条数据中,表单中多值附件字段,上传同名内容不同附件 | 文件下载正常 删除一个附件时,不影响其他 |
2 | 在不同数据中,上传同名不同内容附件 | 文件下载正常 删除一个附件时,不影响其他 |
3 | 在不同数据中,上传内容相同名称不同的附件 | 文件下载正常 删除一个附件时,不影响其他 |
4 | 在同一条数据中,上传内容相同名称不同的附件 | 文件下载正常 删除一个附件时,不影响其他 |
LuBase低代码系列文章: