如何使用两个outputStream创建zip文件(使用JSF)

时间:2014-03-06 16:57:25

标签: java jsf-2 stream zip zipoutputstream

我有两个输出流(由jasper报告填充数据以生成一个excel和一个csv)。输出流的填充工作正常,但现在我必须将“流/文件”打包到要下载的zip中。我怎么能这样做?

只下载一个文件的代码如下:

public void exportInternalEvaluation() {
    exportStats(ExportingValues.STATISTICS_INTERNAL_EVALUTATION, EXCEL_NAME, solvedDossiers,
            "application/vnd.ms-excel");
}

private void exportStats(ExportingValues exportingValues, String fileName, Collection < ? > collection,
        String contentType) {
    OutputStream os = null;
    try {
        FacesContext fc = FacesContext.getCurrentInstance();
        ExternalContext ec = fc.getExternalContext();

        ec.responseReset();
        ec.setResponseContentType(contentType);
        ec.setResponseHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
        os = ec.getResponseOutputStream();

        statsLocal.generateStatStream(collection, os, exportingValues.getJasperFileName(null),
                exportingValues.getReportingType());

        fc.responseComplete();
    } 
}

此代码将内容类型设置为excel并允许我下载该文件。我已经找到了以下内容:

        ZipOutputStream zos = new ZipOutputStream(os);  //create a zipOutputStream with my responseOutputStream

然后我一直坚持创建ZipEntries。如何从2个不同的流创建2个条目(1个excel和1个csv)?

编辑: 我真的不想创建2个临时文件并将它们添加到zip中。我想找到一种方法将2个输出流“添加”到一个zip文件中,创建2个不同的文件而不必先创建它们(甚至是tempFiles ..)。如果可能的话......

1 个答案:

答案 0 :(得分:0)

您可以使用 ZipOutputStream 修饰响应流,并将您的生成器代码写入,以确保您在每次调用之间创建新条目:

try (OutputStream os = ec.getResponseOutputStream();
    ZipOutputStream zout = new ZipOutputStream(os)) {
  zout.putNextEntry(new ZipEntry("foo.xls"));
  generate(zout, "Excell gen call args");
  zout.closeEntry();
  zout.putNextEntry(new ZipEntry("foo.csv"));
  generate(zout, "CSV gen call args");
  zout.closeEntry();
}