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);
}
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!