SAPUI5应用图片存储咨询:离线场景下的同步难题
你完全不需要被迫把图片存在SAP的数据库里,这里有几个可行的方案来实现离线拍照+后续同步到自有服务器的需求:
离线本地文件存储+自定义同步逻辑
离线状态下,直接把拍摄的照片存在移动设备的本地文件系统里(比如用Cordova的cordova-plugin-file插件来操作本地文件),同时在本地的离线存储(比如SAP提供的本地SQLite数据库,或者你自己的本地存储)里记录图片的元数据:文件名、拍摄时间、本地路径、同步状态(未同步/已同步)。等设备恢复在线后,触发同步流程,遍历未同步的图片记录,把本地文件上传到你的自有服务器,上传成功后更新同步状态,避免重复上传。借助SAP Mobile Services的离线能力但最终同步到自有服务器
如果你已经在用SAP Mobile Services的离线OData功能,它确实支持二进制数据的离线存储,但你可以只把它作为离线状态下的临时中转:离线时把图片暂存在Mobile Services的离线存储中,在线后通过自定义的API调用,把图片从SAP的离线存储迁移到你的自有服务器,然后清理SAP侧的临时数据。不过这种方案不如直接存在设备本地高效,毕竟多了一层中转。避免把图片塞进数据库的核心原则
不管用哪种方案,都要记住:图片这类大二进制文件,最优选择是存在文件系统(设备本地或云存储服务器),数据库只用来存储管理文件的元数据,这样既节省数据库空间,也能提升读写性能。SAP的离线框架只是帮你管理离线状态下的数据同步逻辑,并没有强制要求你把图片存入SAP的在线数据库。
举个简单的流程例子:
- 离线时,用户拍摄照片 → 保存到设备本地文件夹 → 在本地SQLite插入一条记录:
{id: 123, filename: "photo_20240520.jpg", localPath: "/storage/emulated/0/MyApp/photos/photo_20240520.jpg", synced: false}- 设备恢复在线 → 应用检测到网络连接 → 遍历所有
synced: false的记录 → 调用自有服务器的上传API,把本地文件传过去 → 上传成功后,把本地记录的synced改为true
这样全程都不需要把图片存入SAP的任何数据库,完全符合你的初始计划。
内容的提问来源于stack exchange,提问作者Adam Harkus

