Olá,

Se o seu código está gerando stacktrace abaixo, veja a minha dica.

[2013-01-08 17:11:49,611] ERROR - getOutputStream() has already been called for this response
java.lang.IllegalStateException: getOutputStream() has already been called for this response
        at org.apache.catalina.connector.Response.getWriter(Response.java:611)
        at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:198)
        at com.sun.faces.context.ExternalContextImpl.getResponseOutputWriter(ExternalContextImpl.java:723)
        at com.sun.faces.application.view.FaceletViewHandlingStrategy.createResponseWriter(FaceletViewHandlingStrategy.java:938)
        at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:377)
        at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:125)
        at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:288)
        at org.apache.myfaces.tomahawk.application.ResourceViewHandlerWrapper.renderView(ResourceViewHandlerWrapper.java:93)
        at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:121)
        at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
        at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
        at javax.faces.webapp.FacesServlet.service(FacesServlet.java:594)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at br.com.elucid.crm.controle.servlet.LoginFilter.doFilter(LoginFilter.java:37)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
        at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
        at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
        at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)

Uma forma de corrigir é trocar o OutputStream pelo Writer.  A linha comentada no código abaixo é a que gera o erro, foi substituída pela linha do Writer. O erro foi gerado usando JSF (MyFaces), mas a dica pode servir usando outros frameworks.

//OutputStream outputStream = externalContext.getResponseOutputStream();
Writer w = externalContext.getResponseOutputWriter();
String caminhoCompleto = caminho
		+ System.getProperty("file.separator")
		+ nomeDoArquivo;
try {
	File file = new File(caminhoCompleto);
	FileInputStream fis = new FileInputStream(file);
	int b;
	while ((b = fis.read()) != -1) {
		w.write(b);
	}
	w.flush();
	w.close();
	fis.close();
} catch (ClientAbortException cae) {
	logger.info("Download interrompido", cae);
} catch (FileNotFoundException e) {
	throw new InfraEstruturaException("Arquivo não encontrado - "
			+ caminhoCompleto);
}
Share


Um comentário

  1. #
    Walter Junior
    janeiro 13th, 2017 at 17:15

    Olá Furutani, saudações!

    Estou com um problema quando faço download de um arquivo ele faz o download certinho, mas da erro no eclipe aqui esta a rotina:

    public void downloadFile(ActionEvent e) throws IOException {
    String nomedoarquivo = (String) e.getComponent().getAttributes().get(“carquivo”);
    FacesContext ctx = null;
    // ExternalContext ectx = ctx.getExternalContext(); //aqui que esta dando erro ….
    File file = new File(“C:/Dados/”+nomedoarquivo);
    HttpServletResponse response = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
    //HttpServletResponse response = (HttpServletResponse) ectx.getResponse();
    response.setHeader(“Content-Disposition”, “attachment;filename=”+nomedoarquivo);
    response.setContentLength((int) file.length());
    //ServletOutputStream out = null;

    //resp.setContentType(mimeType);

    FileInputStream in = new FileInputStream(file);
    OutputStream out = response.getOutputStream();
    byte[] buf = new byte[(int) file.length()];
    int count;
    while ((count = in.read(buf)) >= 0) {
    out.write(buf, 0, count);
    }
    in.close();
    out.flush();
    out.close();
    //ctx.responseComplete();
    FacesContext.getCurrentInstance().getResponseComplete();

    }
    Tentei implementar como esta em sua explicação, mas ele da erro no:
    Writer w = externalContext.getResponseOutputWriter();

    Preciso de sua ajuda!

    Obrigado!

    Responda a esse comentário

Deixe um comentário