1

reportServiceクラスを使用して、レポートを含むJasperPrintオブジェクトを生成し、それをサーブレットに送信すると、PDFが生成されます。問題は、このサーブレットがPDFを新しいタブで開いていないことです(これが私が欲しいものです)。実際には、PDFをダウンロードするように促されることすらありません。

サーブレット呼び出し元:

   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();
    }

サーブレットからの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();    
    }
}

私は何が間違っているのですか?

4

2 に答える 2

1

アプリケーションのフレックス側で開きたいファイルの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();
}
于 2012-07-16T13:21:33.070 に答える
1

JasperPrintをbyte[]としてflexアプリケーションに返す問題を解決しました。flexではByteArrayとして扱われ(私の場合はgranitedによって変換されるため)、このByteArrayを送信するサーブレットを呼び出すだけです。 。

私は別の解決策を探していますが、それは他の誰かを助けることができます。

于 2012-07-11T17:30:10.893 に答える