3

JasperReportsで生成されたPDFファイルをユーザーのブラウザーに送信しようとしていますが、マネージドBeanメソッドの何が問題になっているのかわかりません。スニペットを次に示します。

System.out.println("Making pdf...");

        FacesContext fc = FacesContext.getCurrentInstance();
        ExternalContext ec = fc.getExternalContext();
        String tplPath = ec.getRealPath("testTemplate.jrxml");
        JasperReport jasperReport = JasperCompileManager.compileReport(tplPath);
        JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, new HashMap<String,Object>(), ds );

        String pdfName = "/testReport.pdf";
        String pdfPath = ec.getRealPath(pdfName);
        JasperExportManager.exportReportToPdfFile(jasperPrint, pdfPath);

        System.out.println("PDF ready!");

        ec.responseReset(); 
        ec.setResponseContentType(ec.getMimeType(pdfPath)); 
        //ec.setResponseContentLength(contentLength); 
        ec.setResponseHeader("Content-Disposition", "attachment; filename=\"" + pdfName + "\""); 

        InputStream input = new FileInputStream(pdfPath);
        OutputStream output = ec.getResponseOutputStream();
        IOUtils.copy(input, output);

        System.out.println("Sending to browser...");

        fc.responseComplete();  

これは、ユーザーがクリックするだけで呼び出されます。

<p:menuitem value="TestPDF" action="#{menuController.getTestPdf()}" />

見つけやすい気がします。なぜ見えないの?:)

4

1 に答える 1

8

デフォルトでは<p:menuitem>ajaxを使用します。ajaxでファイルをダウンロードすることはできません。JavaScriptにはセキュリティ上の理由から、変数内の任意のコンテンツを使用して[名前を付けて保存]ダイアログをプログラムで強制する機能はありません。

ajaxをオフにするだけです。

<p:menuitem ... ajax="false" />

参照:

于 2012-12-18T12:19:03.320 に答える