0
public String generateReport()    {
 try

            {

                final FacesContext facesContext = FacesContext.getCurrentInstance();
                final HttpServletResponse response = (HttpServletResponse) facesContext.getExternalContext().getResponse();
                response.reset();
                response.setHeader("Content-Disposition", "attachment; filename=\"" + "myReport.zip\";");
                final BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream());
                final ZipOutputStream zos = new ZipOutputStream(bos);

                for (final PeriodScale periodScale : Scale.getPeriodScales(this.startDate, this.endDate))
                {
                    final JasperPrint jasperPrint = JasperFillManager.fillReport(
                        this.reportsPath() + File.separator + "periodicScale.jasper",
                        this.parameters(this.reportsPath(), periodScale.getScale(),
                            periodScale.getStartDate(), periodScale.getEndDate()),
                        new JREmptyDataSource());

                    final byte[] bytes = JasperExportManager.exportReportToPdf(jasperPrint);
                    response.setContentLength(bytes.length);

                    final ZipEntry ze = new ZipEntry("periodicScale"+ periodScale.getStartDate() + ".pdf"); // periodicScale13032015.pdf for example
                    zos.putNextEntry(ze);
                    zos.write(bytes, 0, bytes.length);
                    zos.closeEntry();
                }
                zos.close();
                facesContext.responseComplete();
            }
            catch (final Exception e)
            {
                e.printStackTrace();
            }

            return "";
}

これは、JasperReport を印刷するためにユーザーによって呼び出される managedBean のアクション メソッドですが、zip ファイル内に複数のレポートを配置しようとすると機能しません。

getPeriodScales は 2 つのオブジェクトを返し、JasperFillManager.fillReport は正常に実行されています。1 つのレポートのデータを生成するだけでレポートが印刷されますが、2 つのレポートをストリーミングしようとして WinRar で開くと、1 つだけが表示され、「予期しないアーカイブの終わり」が表示されます。 、7zip では両方が表示されますが、2 つ目は破損しています。

何が間違っているのですか、または複数のレポートを圧縮せずにストリーミングする方法はありますか?

4

1 に答える 1

1

bytes.length私はサイズで応答の contentLenght を設定していましたが、それはbytes.length * Scale.getPeriodScales(this.startDate, this.endDate).size()

于 2015-03-13T17:39:32.360 に答える