springboot项目,打成war包线上执行,获取路径错误

错误原因

 项目进行excel,pdf导出操作使用本地环境运行

这里可以看到我们点击下载文件成功的下载下来了

但是当我么打成war包遇到线上环境 结果下载失败

 

让我么看看线上的报错,可以明显看到路径上莫名多了叹号 

 经过查询得知在JAR/WAR文件中,类路径资源是通过JAR URL协议进行访问的,格式形如 jar:file:/path/to/war-file.war!/META-INF/some-resource.txt。这里的叹号(!)用于分隔WAR/JAR文件的实际路径和其中内部资源的具体路径。

修改代码

知道具体原因了我们就要修改代码,我打算使用流来进行操作

// 加载jrxml模板文件并编译成jasper文件
InputStream jrxmlInputStream =this.getClass().getResourceAsStream("/static/template/health_business3.jrxml");
JasperReport jasperReport = JasperCompileManager.compileReport(jrxmlInputStream);
//使用JasperFillManager填充数据到jasper模板,生成JasperPrint对象
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, result, new JRBeanCollectionDataSource((List<Map>) result.get("hotSetmeal")));

修改后的代码本地运行,下载正常

将excel一样进行修改

上传到服务器测试下载功能

发现excel下载功能正常,但是pdf还是出问题,报这个错误

java.lang.IllegalArgumentException: name通常是由于找不到指定名称的资源引发的。而我们的模版刚好有一个图片资源,根据上边情况绝对路径也不行

我使用了map接收查询到的map需要的资源,

 现在我们只需要往这个result添加图片流

result.put("ImageInputStream", ImageStream);
//ImageStream是图片流

并且将jrxml修改

<imageExpression>
   //这里我原来写的绝对路径,现在改为map的key
   //还需在xml头标明ImageInputStream的类型
   <![CDATA[$P{ImageInputStream}]]>
</imageExpression>

然后我们再次打上war包运行 

OK下载正常了