从临时目录打开InputStream时出错

时间:2014-07-23 17:16:20

标签: java spring spring-mvc jasper-reports

编辑:我建议不要将.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]

我很感激你能在这上面获得的任何亮光!

1 个答案:

答案 0 :(得分:0)

多部分保存的tmp文件导致新文件名。创建自己的临时目录解决了该问题。在Linux上,getProperty缺少斜杠

    String tempDirectory = System.getProperty("java.io.tmpdir");
    if(  !tempDirectory .endsWith("/") && !tempDirectory .endsWith( "\\") ) {
        tempDirectory = tempDirectory +"/";