InputStream resourceAsStream = processEngine.getRepositoryService().getResourceAsStream("流程定义ID", "要查看的流程图或xml文件名称");
查询时用到的 流程定义ID 指的是 act_re_deployment 表中的 ID_ 字段。

查询时用到的 流程图或xml文件名 指的是 act_re_procdef 表中的 RESOURCE_NAME_ 字段。
PS 可以发现 act_re_deployment 中的 ID 和 act_re_procdef 中的 DEPLOYMENT_ID_ 是关联一致的

详细介绍springboot整合flowable引擎的可以查看这里
<dependency>
<groupId>org.flowable</groupId>
<artifactId>flowable-spring-boot-starter</artifactId>
<version>6.3.0</version>
</dependency>
实现根据数据获取对应的文件流并写入本地存储功能
@Autowired
private ProcessEngine processEngine; //注入flowable提供的ProcessEngine,包含了查看流程图和xml功能
/**
* @Author: ljh
* @Description: 查看流程图或xml
* @DateTime: 10:41 2022/9/17
* @Params: flowId流程ID
* photoName 流程图名称或者xml文件名称
* @Return
*/
public void loadFlowXml(String flowId,String photoName){
//根据ID和名称获取到流
InputStream resourceAsStream = processEngine.getRepositoryService().getResourceAsStream(flowId, photoName);
try {
//将流写出到本地磁盘存储
FileUtils.copyInputStreamToFile(resourceAsStream, new File("D://1.png"));
} catch (IOException e) {
e.printStackTrace();
}
}
实现根据前端页面送的数据拼接出来流程图的本地存储路径,然后判断该流程图是否存在本地,如果存在就直接将该文件路径映射为url返回给前端,如果不存在就使用flowable提供的api重新获取,接着依然存储在本地后再将路径映射为url返回前端(方便后面再获取该图片时直接从本地读取即可,不需要每次都使用flowable的api)
// 本地磁盘D://
@Value("${bpmn.path:{null}}")
private String bpmnPath;
@Autowired
private ProcessEngine processEngine; //注入flowable提供的ProcessEngine,包含了查看流程图和xml功能
@ApiOperation("查看流程图")
@PostMapping("/loadFlowPhoto")
public Result loadFlowPhoto(@RequestBody Flow flow){ //自己封装的请求参数实体类
Result result = new Result();
String photoUrlByFileName = null;
try {
//流程图名称
String pngName = null;
if(flow.getFlowPhotoName().contains("/")){
pngName = flow.getFlowPhotoName().substring(flow.getFlowPhotoName().indexOf("/")+1,flow.getFlowPhotoName().length());
}else{
pngName = flow.getFlowPhotoName().substring(flow.getFlowPhotoName().indexOf("\\")+1,flow.getFlowPhotoName().length());
}
//pngPath 本地存储流程图的路径 bpmnPath是在yml中配置的路径 D:// pngName是上面切割出来的流程图名称
String pngPath = bpmnPath+pngName;
//判断是否已存在
File file = new File(pngPath);
if(file.exists()){
//存在
//getPhotoUrlByFileName 方法是我自己封装的获取图片url地址的方法
photoUrlByFileName = photoUtils.getPhotoUrlByFileName(pngName);
}else{
//不存在
InputStream resourceAsStream = processEngine.getRepositoryService().getResourceAsStream(flow.getFlowId(), flow.getFlowPhotoName());
//写入本地
FileUtils.copyInputStreamToFile(resourceAsStream, new File(pngPath));
//getPhotoUrlByFileName 方法是我自己封装的获取图片url地址的方法
photoUrlByFileName = photoUtils.getPhotoUrlByFileName(pngName);
}
//result是自己封装的数据结构
result.setStatus(200);
//将路程图的url地址返回 供前端页面使用
result.setData(photoUrlByFileName);
result.setMessage("获取成功");
} catch (IOException e) {
e.printStackTrace();
result.setStatus(500);
result.setMessage("获取失败");
}
return result;
}
//在yml文件中配置好的端口好
@Value("${server.port:{null}}")
private String port;
/**
* @Author: ljh
* @Description: 映射本地图片地址
* @DateTime: 11:25 2022/7/19
* @Params:
* @Return
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
/**
* 访问路径:http://localhost:8086/image/2022001.png
* "/image/**" 为前端URL访问路径
* "file:" + bmpPath 是本地磁盘映射
*/
registry.addResourceHandler("/image/**").addResourceLocations("file:" + bpmnPath);
}
/**
* @Author: ljh
* @Description: 获取图片url地址
* @DateTime: 16:30 2022/7/21
* @Params: 图片名称
* @Return 图片url地址
*/
public String getPhotoUrlByFileName(String name){
String hostAddress = null;
//获取本地IP地址
try {
hostAddress = InetAddress.getLocalHost().getHostAddress();
} catch (UnknownHostException e) {
return null;
}
String photoUrl = null;
if(name.contains(".png")){
photoUrl = "http://"+hostAddress+":"+port+"/api/image/"+name;
}else{
photoUrl = "http://"+hostAddress+":"+port+"/api/image/"+name+".png";
}
return photoUrl;
}