多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
## 一、概述 比如业务中,有需要对某个实体设定图片等媒体文件,并与实体进行关联的业务,平台也提供了解决方案; 针对图像数据的存储,平台提供了两种方案,分别是库表保存和文件保存; ## 二、库表保存方案 库表保存方案是在库表设计中,设计一个二进制字段来保存,可以是业务表中的二进制字段,也可以是通用的平台单独设计的专用图片表字段; 如果已经在业务表中设计了存储图片的二进制字段,则使用该字段;如果业务表中没有单独设计字段,那就使用通用图片表(SYS_PIC)来存储; 具体的实现方案如下: ### **新增图片** 新增的时候,直接跟普通字段一样提交即可; #### 1、post对象提交 post中TeleChatbot对象里面的chatbotLogo字段; ``` TeleChatbot bot = post.getTeleChatbot(); TeleChatbot persisted = teleChatbotDao.save(bot); persisted.setChatbotLogoUrl(ShowMedia.url(MediaType.PIC, "TeleChatbot", "chatbotLogo", bot.getChatbotId())); ``` #### 2、单独参数提交: logoFileBase64字段; ``` SysPic syspic = sysPicDao.getSysPicByPicCode("logo"); syspic.setContent(logoFileBase64.getBytes()); sysPicDao.save(syspic); ``` ### **修改图片** #### 1、业务字段的: ``` SysStaffProfile profile = sysStaffProfileDao.getSysStaffProfileOfSpecStaff(staffObj.getStaffId()); this.preForcedLoadingLazyBlobFieldForUpdate(sysStaffProfileDao, profile, "photo"); profile.setPhoto(avator.getBytes()); sysStaffProfileDao.save(profile); profile.setAvatar(ShowMedia.url(MediaType.PIC, "SysStaffProfile", "photo", profile.getProfileId())); ``` >[danger] 特别注意: > 1、ShowMedia.url(MediaType.PIC, "SysStaffProfile", "photo", profile.getProfileId()),就能取得到存储在数据库中的媒体文件的访问地址; > 2、上述地址可以存储到库表字段,也可以仅在显示的时候,临时构造即可; > 3、修改的时候,必须强制执行preForcedLoadingLazyBlobFieldForUpdate; #### 2、通用实体的: ``` SysPic syspic = sysPicDao.getSysPicByPicCode("logo"); if (syspic == null) { syspic = new SysPic(); syspic.setDomainId(1L); syspic.setPicCode("logo"); } this.preForcedLoadingLazyBlobFieldForUpdate(sysPicDao, syspic, "content"); syspic.setContent(logoFileBase64.getBytes()); sysPicDao.save(syspic); //该文件的url ShowMedia.getLogoMedia(pic.getPicId()) ``` ## 三、文件保存方案 有些业务场景中,使用库表保存,仅理论可行,但考虑性能和可伸缩性,实际使用库表保持并不是最优方案,比如电商业务; 那么,可以使用文件来保存,当然文件的存储可以采用网络存储或本地解决方案,平台提供了一个通用解决方案,后端可以通过参数来配置当前项目启用本地存储还是网络存储,它们都是以文件为存储的形式,可以通过路径直接访问; 下面介绍一下本地存储的技术方案,网络存储比较简单,直接调用方案商提供的官方接口即可; 参考:[文件资源方案](%E6%96%87%E4%BB%B6%E8%B5%84%E6%BA%90%E6%96%B9%E6%A1%88.md)