BonitaSoft附件存储位置查询及跨流程调用与转存方案咨询
BonitaSoft 附件存储与跨实例检索解决方案
一、默认附件存储说明
Bonita默认将附件存储在内置数据库或文件系统中(取决于配置),但默认存储路径不直接对外暴露,所以无法直接定位到具体文件。要自定义存储位置并记录路径到BDM,需通过自定义代码实现。
二、自定义附件存储到指定位置并写入BDM
实现步骤
- 创建BDM实体:定义
AttachmentRecord实体,包含字段:instanceId(流程实例ID)、attachmentName(附件名称)、storagePath(存储路径)、uploadTime(上传时间),部署到Bonita环境。 - 添加脚本任务:在附件提交后的流程环节中添加脚本任务,完成附件读取、自定义存储、BDM记录写入。
示例Groovy脚本
import org.bonitasoft.engine.api.APIAccessor import org.bonitasoft.engine.api.ProcessAPI import org.bonitasoft.engine.bpm.document.Document import org.bonitasoft.engine.bpm.document.DocumentValue import java.nio.file.Files import java.nio.file.Paths import java.nio.file.StandardCopyOption // 获取API实例 APIAccessor apiAccessor = ApiAccessorUtil.getApiAccessor() ProcessAPI processAPI = apiAccessor.getProcessAPI() // 获取当前流程实例的附件(替换为你的附件变量名) Document document = processAPI.getDocument(processInstanceId, "uploadedFile") DocumentValue docValue = processAPI.getDocumentContent(document.getContentStorageId()) // 自定义存储目录(确保Bonita服务有读写权限) def targetDir = "/opt/bonita/custom_attachments/" Files.createDirectories(Paths.get(targetDir)) def targetPath = targetDir + document.getFileName() // 写入附件到目标路径 Files.copy(docValue.getInputStream(), Paths.get(targetPath), StandardCopyOption.REPLACE_EXISTING) // 初始化BDM实体并保存 def attachmentRecord = new AttachmentRecord() attachmentRecord.setInstanceId(processInstanceId) attachmentRecord.setAttachmentName(document.getFileName()) attachmentRecord.setStoragePath(targetPath) attachmentRecord.setUploadTime(new Date()) apiAccessor.getBusinessDataAPI().create(attachmentRecord)
三、跨流程实例检索附件
方法1:通过BDM查询
在需要检索的流程环节添加脚本任务,通过BDM API查询指定条件的附件记录:
import org.bonitasoft.engine.api.APIAccessor import org.bonitasoft.engine.businessdata.BusinessDataAPI APIAccessor apiAccessor = ApiAccessorUtil.getApiAccessor() BusinessDataAPI bdAPI = apiAccessor.getBusinessDataAPI() // 根据目标流程实例ID查询附件 def records = bdAPI.query("AttachmentRecord") .where("instanceId = :instanceId") .parameter("instanceId", targetInstanceId) .list() if (!records.isEmpty()) { def targetPath = records.get(0).getStoragePath() // 后续可根据路径读取文件内容 }
方法2:通过Bonita文档API(默认存储场景)
若使用默认存储,可直接通过文档API跨实例获取附件:
import org.bonitasoft.engine.api.APIAccessor import org.bonitasoft.engine.api.ProcessAPI APIAccessor apiAccessor = ApiAccessorUtil.getApiAccessor() ProcessAPI processAPI = apiAccessor.getProcessAPI() // 根据目标实例ID和附件变量名获取附件 Document document = processAPI.getDocument(targetInstanceId, "uploadedFile") DocumentValue docValue = processAPI.getDocumentContent(document.getContentStorageId()) // 读取docValue.getInputStream()获取附件内容
注意事项
- 确保Bonita运行用户对自定义存储目录拥有读写权限,避免IO异常。
- 脚本中的附件变量名(如
uploadedFile)需与流程中定义的变量名完全一致。 - BDM实体部署后,需重启Bonita服务确保生效。
内容的提问来源于stack exchange,提问作者chris_dev
相关产品推荐
相关产品推荐

