需要一种在服务层中实例化ZipOutputStream对象的方法

时间:2012-06-21 04:10:24

标签: java zipoutputstream

我的bean类中有以下代码块 -

HttpServletResponse response = (HttpServletResponse) getFacesContext().getExternalContext().getResponse();
ZipOutputStream zos = new ZipOutputStream(response.getOutputStream());

从我的bean我调用我的服务层,服务层又调用数据库层,检索数据并将ZIP文件中生成的文件写入服务层。我有一个问题,我不知道如果没有生成文件该怎么办。

当我在我的bean中实例化ZipOutputStream对象时,它会创建一个ZIP文件并打开一个“Opening Extracts.zip”窗口,当我点击OK时,我收到一个错误,因为ZIP文件夹中没有文件。

可以somoone请告诉我是否有任何方法可以将zos实例移动到服务层而无需传递响应对象?

谢谢, Raaz

1 个答案:

答案 0 :(得分:1)

我发现我可以执行以下操作来解决我的问题 -

在我的bean类中,我编写了以下代码 -

HttpServletResponse response = (HttpServletResponse) getFacesContext().getExternalContext().getResponse();
ByteArrayOutputStream outputStream = null;

try {
    outputStream = //Call service to generate the extract, return outputStream ; 
    if(outputStream != null){
    response.setContentType(T3Constants.MIME_ZIP);
    response.setHeader(T3Constants.CONTENT_DISPOSITION, ATTACH_FILE_NAME);
    response.getOutputStream().write(outputStream.toByteArray());
    response.flushBuffer();
    FacesContext.getCurrentInstance().responseComplete();
    outputStream.close();
    } else {
    formatFacesMessage(FacesMessage.SEVERITY_WARN, "No data for selected filter", "No data for selected filter");
    }
}

在我的服务中,我写了以下代码 -

ByteArrayOutputStream outputStream = null;
if(CollectionUtils.isNotEmpty(list returned from DB)) {
    outputStream = new ByteArrayOutputStream();
    ZipOutputStream zos = new ZipOutputStream(outputStream);
    //Add files to ZIP
    outputStream = new ByteArrayOutputStream();
    workbook.write(outputStream);
    zos.putNextEntry(new ZipEntry(xlsName.toString()));
    zos.write(outputStream.toByteArray());
    zos.flush();
    zos.close();
return outputStream;
}

谢谢, Raaz