我的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
答案 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