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!