使用flex + servlet + jasper在新浏览器选项卡中显示PDF的问题

时间:2012-07-06 12:58:11

标签: java flex servlets jasper-reports

我正在使用reportService类生成包含我的报告的JasperPrint对象,然后将其发送到Servlet并生成PDF。问题是这个servlet没有在新标签中打开PDF(这就是我想要的),实际上它甚至没有提示我下载它或任何东西。

Servlet来电者:

   try {
        URL url = new URL("http://" + serverName + ":" + serverPort + path
                + "/reportgenerator");

        HttpURLConnection connection = (HttpURLConnection) url
                .openConnection();

        connection.setRequestMethod("POST");
        connection.setDoInput(true);
        connection.setDoOutput(true);
        connection.setUseCaches(false);
        connection.setDefaultUseCaches(false);
        connection.setRequestProperty("Content-Type",
                "application/octet-stream");

        ObjectOutputStream out = new ObjectOutputStream(
                connection.getOutputStream());

        //This "jasperPrint" is my generated report from my service
        out.writeObject(jasperPrint);
        out.close();

        connection.getInputStream();

    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

我的Servlet中的doPost方法:

@Override
protected void doPost(HttpServletRequest request,
        HttpServletResponse response) throws ServletException, IOException {

    JasperPrint jasperPrint = null;
    ObjectInputStream resultStream = null;
    ServletOutputStream out = response.getOutputStream();       

    try {

        resultStream = new ObjectInputStream(request.getInputStream());
        jasperPrint = (JasperPrint) resultStream.readObject();
        resultStream.close();

        byte[] rel = JasperExportManager.exportReportToPdf(jasperPrint);            
        out.write(rel,0, rel.length);

       //JasperExportManager.exportReportToPdfStream(jasperPrint, out);

        response.setContentLength(rel.length);          
        response.setContentType("application/pdf");
        response.setHeader("Content-Disposition",
                "attachment; filename=\"report.pdf\"");
        response.setHeader("Cache-Control", "no-cache");                        

        System.err.println(rel.length);

    } catch (JRException e) {
        e.printStackTrace();
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    } finally {                 
        out.flush();
        out.close();    
    }
}

我做错了什么?

2 个答案:

答案 0 :(得分:1)

我已经解决了我的问题,将JasperPrint作为byte []返回到我的flex应用程序,在flex中它将被视为ByteArray(因为它被转换为,在我的情况下是granits)然后我只是调用我的servlet发送这个ByteArray。

我正在寻找另一种解决方案,但它可以帮助其他人。

答案 1 :(得分:1)

假设您要在应用程序的flex端打开文件的byte [],您应该能够将文件写入临时位置然后打开它。它看起来与此类似:

//create a temp dir in the system temp directory to place all the temp files for you app.
private static var tempDir:File=File.createTempDirectory();    

/**
 * bytes - the byte array of the pdf you want to open
 * filename - the name to use for the temp file, you may need to create some type of
 *            counter to add to the beginning of the filename so that you always get
 *            a unique name 
 */
public static openFile(bytes:ByteArray,filename:String):void{
   //create a file in the system temp directory to write the file to
   var tempFile:File = tempDir.resolvePath(filename);

   //create a filestream to write the byte array to the file
   var fileStream:FileStream = new FileStream(); 
   fileStream.open(tempFile, FileMode.WRITE); 
   fileStream.writeBytes(bytes,0,bytes.length);
   fileStream.close();

   //open the temp file with default application
   tempFile.openWithDefaultApplication();
}