Eu quero saber se tem como eu gerar um arquivo de texto e enviá-lo pela response sem precisar salvá-lo em disco.
O único modo que eu consegui fazer foi:
List<LinhasArquivoTexto> linhas = new ArrayList<LinhasArquivoTexto>();
PrintWriter writer = new PrintWriter(new BufferedWriter(new FileWriter("arquivo.txt")));
for(LinhasArquivoTexto l : linhas) writer.print(l.gerarLinha());
writer.flush();
writer.close();
response.setContentType("application/plain");
response.setHeader("Content-Disposition","attachment; filename=arquivo.txt");
File arquivo = new File("arquivo.txt");
FileInputStream reader = new FileInputStream(arquivo);
byte[] b = new byte[(int)arquivo.length()];
reader.read(b);
OutputStream saida = response.getOutputStream();
saida.write(b);
saida.flush();
reader.close();
Eu to gerando um arquivo de texto q será importado para um outro sistema tosco e véio lá de outra empresa.
É baseado em algumas informações q vem de um relatório que fica com um nº N de linhas.
Então eu vou gerar o arquivo a partir de um relatório, ele não existe previamente.
Vou testar teu método avsouza … já digo se funcionou!
Funcionou quase 100%…
O arquivo vem perfeitamente como eu queria, mas da um erro
15:05:39,405 ERROR [action]:250 - Servlet.service() for servlet action threw exception
java.lang.IllegalStateException: getOutputStream() has already been called for this response
at org.apache.catalina.connector.Response.getWriter(Response.java:601)
at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:196)
at javax.servlet.ServletResponseWrapper.getWriter(ServletResponseWrapper.java:112)
at javax.servlet.ServletResponseWrapper.getWriter(ServletResponseWrapper.java:112)
at org.apache.jasper.runtime.JspWriterImpl.initOut(JspWriterImpl.java:125)
at org.apache.jasper.runtime.JspWriterImpl.flushBuffer(JspWriterImpl.java:118)
at org.apache.jasper.runtime.PageContextImpl.release(PageContextImpl.java:177)
at org.apache.jasper.runtime.JspFactoryImpl.internalReleasePageContext(JspFactoryImpl.java:116)
at org.apache.jasper.runtime.JspFactoryImpl.releasePageContext(JspFactoryImpl.java:76)
at org.apache.jsp.arquivo_jsp._jspService(arquivo_jsp.java:135)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:98)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:328)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:315)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:368)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:691)
at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:594)
at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:505)
at org.apache.struts.action.RequestProcessor.doInclude(RequestProcessor.java:1116)
at org.apache.struts.tiles.TilesRequestProcessor.doForward(TilesRequestProcessor.java:260)
at org.apache.struts.action.RequestProcessor.processForwardConfig(RequestProcessor.java:398)
at org.apache.struts.tiles.TilesRequestProcessor.processForwardConfig(TilesRequestProcessor.java:318)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:241)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:368)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:210)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:174)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:151)
at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:834)
at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:640)
at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1286)
at java.lang.Thread.run(Thread.java:619)
Mesma coisa :?
Eu achei umas discussões sobre esse erro falando q pode ser relacionado ao ContentType por ocorrerem várias declarações dele (na página e depois na Action) mas mesmo tirando da página o erro continua…
Tá do mesmo jeito q o teu esquema aí, mas no meu da erro =D
Sei lá… vo continuar procurando a causa e a solução… qd encontrar eu posto aqui.
Vlw pela ajuda!