2017-09-08 6 views
0

나는 제트를 사용하여 보고서를 생성하는 방법을 가지고 그 사용자에 대한 파일 다운로드 대화 상자가 표시됩니다 : 텍스트 문서로하고 바이트 않고,다운로드 할 xls 파일을 손상시키는 ExternalContext 호출을 수정하는 방법은 무엇입니까?

FacesContext facesContext = FacesContext.getCurrentInstance(); 
    ExternalContext externalContext = facesContext.getExternalContext(); 
    externalContext.responseReset(); 
    externalContext.setResponseContentType("application/vnd.ms-excel"); 
    externalContext.setResponseHeader("Content-Disposition", "attachment; filename=\"" + "precificacao.xls" + "\""); 

    //map beans omitted 

    FileOutputStream saida = null; 
    try { 
     saida = new FileOutputStream(getClass().getResource("/.").getPath() + "/precificacao.xls"); 
    } catch (IOException e) { 
     System.err.println(getClass().getResource("/.").getPath() + "/precificacao.xls" + ": " + e.getMessage()); 
    } 

    InputStream entrada = null; 
    try { 

     entrada = new BufferedInputStream(new FileInputStream(getClass().getResource("/template.xls").getFile())); 

     ExcelTransformer transformer = new ExcelTransformer(); 
     Workbook workbook = transformer.transform(entrada, beans); 
     workbook.write(saida); 

     saida.flush(); 
     saida.close(); 

     facesContext.responseComplete(); 
    } //catch ommitted 

다운로드 한 파일이 이미 손상되었습니다 : print

이 다운로드 대화 상자 루틴 전에

는, XLS는 일반적으로 생성 된, 그래서 나는 그것이 내가 XLS에 대한 올바른 명칭에있는 링크를 보았다하지만 내가 잘못된 길을 가고있어 setResponseContentType 생각 : http://www.iana.org/assignments/media-types

+0

를 해결? – Kukeltje

+0

같은 방식으로 손상되었습니다 ... 내가 여러 가지 ExternalContext 호출을 시도하고 항상 손상되었습니다 ... 뭔가 @ Kukeltje 제안? – philabreu

+0

** 디버그 ** 응답을 제안합니다 ... 크기는 얼마입니까, 비어 있습니까? 고정 된 엑셀을 다운로드하면 어떻게 될까요? 고정 PDF를 다운로드하는 경우 고정 이미지 (이 모든 구성을 통해 모두)를 다운로드하면 어떨까요? 사물을 제거하십시오 ... 원인을 좁히십시오 ... 중단 점 설정 ... – Kukeltje

답변

0

나는이 방법은 ** ** 내용 유형을 설정하지 않으면 어떻게

public void createRelatorioFichaTecnica(Produto produto) throws IOException { 

FacesContext facesContext = FacesContext.getCurrentInstance(); 

ExternalContext externalContext = facesContext.getExternalContext(); 
externalContext.responseReset(); 
externalContext.setResponseContentType("application/vnd.ms-excel"); 
externalContext.setResponseHeader("Content-Disposition", "attachment; filename=\"" + "precificacao.xls" + "\""); 

//map beans omitted 
OutputStream saida = externalContext.getResponseOutputStream(); 
try{ 

    InputStream entrada = new BufferedInputStream(new FileInputStream(getClass().getResource("/template.xls").getFile())); 

    ExcelTransformer transformer = new ExcelTransformer(); 
    Workbook workbook = transformer.transform(entrada, beans); 
    workbook.write(saida); 

    saida.flush(); 
    saida.close(); 

    facesContext.responseComplete(); 
} 
//catch omitted 
} 
+1

제 대답과 수사를 수락 해 주셔서 감사합니다. 다음 번에 질문 코드를 분석하기위한 노력을 기울일 지 확신하지 못했습니다. – Kukeltje

+0

도움을 주셔서 감사합니다! – philabreu

1

요 u 입니다. 응답에 Excel의 내용을 쓰지 않아도됩니까? 따라서 응답은 효과적으로 비어있어 모든 종류의 이상한 행동을 유발합니다.

당신은 PDF와 같은 문제가 있었을 것입니다 ... 어떤 바이트

없이

을 그리고 당신의 이미지에 있습니다

당신은이 직접 쓰기 , 이미지 또는 일반 텍스트 파일 (오류는 아니지만 비어있을 수도 있음)

위와 같은 문제가 발생했을 수도 있습니다. h 일반 서블릿. 따라서 모든 태그 (excel, jsf, jsf-2, xls)는 실제로 문제와 관련이 없습니다. 좁은 것.

컨텍스트에서 출력 스트림을 가져와 통합 문서를 해당 스트림에 쓰면 해결됩니다.

OutputStream saida = externalContext.getResponseOutputStream();