2012-06-21 2 views
1

에 ZipOutputStream이 개체를 인스턴스화하는 방법이 필요합니다 나는 내 빈 클래스에서 다음 코드 블록이 - 내 콩에서는 서비스 계층

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

내가 다시 데이터베이스 계층을 호출 내 서비스 레이어를 호출을, 데이터를 검색하고 ZIP 파일에서 생성 된 파일을 서비스 계층에 씁니다. 나는 파일이 생성되지 않으면 어떻게해야하는지에 대한 단서가없는 문제가있다.

빈에서 ZipOutputStream 객체를 인스턴스화하면 ZIP 파일이 생성되고 "Extracts.zip 열기"창이 열리고 ZIP 폴더에 파일이 없으므로 OK를 클릭하면 오류가 발생합니다 .

응답 객체를 전달하지 않고 서비스 계층에 zos 인스턴스를 이동할 수있는 방법이 있는지 알려 주실 수 있습니까?

덕분에, Raaz

답변

1

가 나는 내 문제를 해결하기 위해 다음을 수행 할 수 있습니다 발견 - 내 서비스에서

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