错误原因
项目进行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下载正常了