🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## 一、概述 原则上,不要用DB字段存储文件,但有时候,因为设计需要,确要通过字段存储文件(图片、音频、视频、文本及其他二进制)除外; ## 二、设计要点 1、数据库表设计的时候,采用longblob来存储文件; 2、基于性能考虑,这些字段需要启用延迟加载; 3、保存的时候,如果是更新,那么,需要将被延迟加载的字段强制调用一次initialize,强制加载一次该字段对象,避免需要更新的字段无法实现更新; 4、如果是读取二进制的时候,也需要将被延迟加载的字段强制调用一次initialize,强制加载一次该字段对象,否则,默认的,平台不会去加载二进制字段(平台提供了通用的二进制读取机制,一般都不需要读取二进制自身来实现读取); 5、保存二进制数据的方法有两种,一种是通过post组合对象,纳入对象中,由后台隐式提交,另外一种是通过参数,直接传入base64,由后台显示提交; 6、平台中,无论哪种提交保存方法,保存到blob中的base64串,都是采用带头部串保存(便于自动侦测文件类型); ## 三、实例代码 注意,二进制字段(已经考虑了一个实体中,有多个blob字段的情形)的处理,包括新增和修改两种情形(删除的话,跟随者实体删除,没有什么好说的); ### **新增字段数据** 新增二进制字段数据,跟随者新增实体对象,二进制字段与该实体的其他普通的字段一样,没有额外处理的需要; ![](https://img.kancloud.cn/4b/f1/4bf120ef9731f16371adf03f43bb0ada_1216x555.png) ### **修改字段数据** 修改实体中的二进制字段数据方法,平台提供了两种方案,一种是通过post组合对象,字段数据纳入对象的字段中,由后台隐式提交,另外一种是通过参数,直接传入base64,由后台设置到实体中,进行显示提交; 以下详细介绍; #### **(1)隐式提交** ``` SysCorporation sysCorporation = post.getSysCorporation(); sysCorporationDao.save(sysCorporation); preForcedLoadingAndUpdatingLazyBlobFields(sysCorporationDao, sysCorporation); ``` >[danger] 特别注意: > 1、这里是所有blob字段的加载和更新一起执行了; > 2、需先单独更新(当然,这个更新无法更新到blob字段,但可以更新除blob字段外的所有字段数据); #### **(2)显示提交** ``` SysStaffProfile profile = sysStaffProfileDao.getSysStaffProfileOfSpecStaff(staffObj.getStaffId()); preForcedLoadingLazyBlobFieldForUpdate(profile); profile.setPhoto(Base64Util.convertOriginalBase64WithHeadForPersist(avator)); sysStaffProfileDao.save(profile); ``` >[danger] 特别注意: > 1、需要通过Base64Util.convertOriginalBase64WithHeadForPersist的预处理,再存到数据库(否则会导致后续无法正常读出); > 2、与隐式提交不同,这里的加载,仅仅是加载,并没有执行更新逻辑,需要在加载后,显示写代码来更新字段数据;