编辑:我建议不要将.jasper文件保存到临时目录,然后尝试从该位置加载。这很麻烦。
我正在尝试将JasperReport功能添加到Spring网络应用程序中。我们的想法是,可以将预编译的.jasper文件添加到服务器的Temp文件夹中,然后填充然后由用户导出。
我可以从类路径中成功读取.jrxml,将其编译为JasperReport
,填充它,然后在同一方法中导出它。在尝试分离这些任务时,我遇到了麻烦。特别是,当尝试从临时目录打开输入流时。
以下代码在temp目录中成功创建了一个已编译的.jasper文件(为简洁起见,我省略了对filename的检查)。
Resource res = appContext.getResource("classpath:jasperreports/"
+ filename + ".jrxml");
File f = new File(
org.apache.commons.lang.SystemUtils.getJavaIoTmpDir(), filename
+ ".jasper");
JasperCompileManager.compileReportToStream(res.getInputStream(),
new FileOutputStream(f));
尝试从temp文件夹中读取会导致出现问题。检查新创建的.jasper的临时文件夹后,我调用以下代码。
Map<String, Object> params = new HashMap<String, Object>();
String resourcePath = org.apache.commons.lang.SystemUtils.getJavaIoTmpDir().getPath().toString();
Resource compiledReport = appContext.getResource(resourcePath + "/" + filename + ".jasper");
//Directly accessing the folder didn't work, either
//Resource compiledReport = appContext.getResource("C:/Users/<MyUsername Here>/AppData/Local/Temp/SimpleEmployeeReport.jasper");
JasperPrint filledReport = JasperFillManager.fillReport(compiledReport.getInputStream(),
params, mds.getConnection());
导致getInputStream抛出异常:
java.io.FileNotFoundException: Could not open ServletContext resource [/C:/Users/<MyUsername>/AppData/Local/Temp/SimpleEmployeeReport.jasper]
我很感激你能在这上面获得的任何亮光!
答案 0 :(得分:0)
多部分保存的tmp文件导致新文件名。创建自己的临时目录解决了该问题。在Linux
上,getProperty
缺少斜杠
String tempDirectory = System.getProperty("java.io.tmpdir");
if( !tempDirectory .endsWith("/") && !tempDirectory .endsWith( "\\") ) {
tempDirectory = tempDirectory +"/";