Foros del Web » Programación para mayores de 30 ;) » Java »

Forzar descarga de archivo en JAVA (JSP)

Estas en el tema de Forzar descarga de archivo en JAVA (JSP) en el foro de Java en Foros del Web. Hola, Tengo una funcion que encontre aqui en el cual la paso el nombe del archivo y lo descarga ya sea imagen texto . esta ...
  #1 (permalink)  
Antiguo 24/10/2008, 12:04
 
Fecha de Ingreso: febrero-2005
Ubicación: 101% Paraguayo
Mensajes: 57
Antigüedad: 19 años, 2 meses
Puntos: 0
Forzar descarga de archivo en JAVA (JSP)

Hola,
Tengo una funcion que encontre aqui en el cual la paso el nombe del archivo y lo descarga ya sea imagen texto . esta es la funcion me descarga pero me da un error:

Funcion
Código PHP:
<!--contents of download.jsp-->
<&
#37;@ page import="java.util.*,java.io.*"%>

//lees el archivo claro que por aqui aplicas algunos filtros de seguridad y esas cosas 
//Le paso asi: ?file=texto.txt
File f = new File ("carpeta/"request.getParameter("file") );
//aqui seleccionas el content type (puede ser excel/word/powerpoint etc..)
response.setContentType ("text/plain");
//aqui seleccionas el nombre con el cual el usuario lo recibira
response.setHeader ("Content-Disposition""attachment; filename=\""+request.getParameter("file")+"\"");
//optenemos el nombre del archivo
String name f.getName().substring(f.getName().lastIndexOf("/") + 1,f.getName().length());
//leemos el archivo para mandarselo al cliente

InputStream in = new FileInputStream(name);
ServletOutputStream outs response.getOutputStream();

int bit 256;
int i 0;
try {
       while ((
bit) >= 0) {
        
bit in.read();
        
outs.write(bit);
    }
    
//System.out.println("" +bit);
}catch (IOException ioe) {
    
ioe.printStackTrace(System.out);
}
outs.flush();
outs.close();
in.close(); 
El archivo me descarga pero me da el siguiete error:

Código:
13:20:33 org.apache.catalina.core.StandardWrapperValve invoke
GRAVE: Servlet.service() para servlet jsp lanzó excepción
java.lang.IllegalStateException: getOutputStream() ya ha sido llamado para esta respuesta
	at org.apache.catalina.connector.Response.getWriter(Response.java:607)
	at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:196)
	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:179)
	at org.apache.jasper.runtime.JspFactoryImpl.internalReleasePageContext(JspFactoryImpl.java:116)
	at org.apache.jasper.runtime.JspFactoryImpl.releasePageContext(JspFactoryImpl.java:76)
	at org.apache.jsp.jsp.Download_jsp._jspService(Download_jsp.java:106)
	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:331)
	at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:329)
	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.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
	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:174)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:874)
	at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
	at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
	at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
	at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)
	at java.lang.Thread.run(Unknown Source)
Por lo que veo el error esta aqui,
ServletOutputStream outs = response.getOutputStream();
pero no entiendo que es, o como solucionar.

Alguna solucion?
Existe alguna otra forma de solucionar esto?

Última edición por SoftEdward; 24/10/2008 a las 12:05 Razón: Actualizacion
  #2 (permalink)  
Antiguo 25/10/2008, 02:36
Avatar de Xinef  
Fecha de Ingreso: marzo-2007
Mensajes: 202
Antigüedad: 17 años, 1 mes
Puntos: 7
Respuesta: Forzar descarga de archivo en JAVA (JSP)

Mira el servlet que se ha generado de ese JSP y busca algún out.println(...), es posible que se esté enviando información al cliente antes de tu envío de fichero.
  #3 (permalink)  
Antiguo 26/08/2010, 09:54
 
Fecha de Ingreso: abril-2008
Mensajes: 9
Antigüedad: 16 años
Puntos: 0
Respuesta: Forzar descarga de archivo en JAVA (JSP)

Hola!!

Dos años después tengo el mismo problema de finalizar este post tengo el mismo problema.
No entiendo la solución que se aporta. Tengo una función muy parecida para descargar ficheros del servidor, sin embargo, obtengo el mismo error:
Código:
java.lang.IllegalStateException: getOutputStream() ya ha sido llamado para esta respuesta
        at org.apache.catalina.connector.Response.getWriter(Response.java:611)
        at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:198)
        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:188)
        at org.apache.jasper.runtime.JspFactoryImpl.internalReleasePageContext(JspFactoryImpl.java:118)
        at org.apache.jasper.runtime.JspFactoryImpl.releasePageContext(JspFactoryImpl.java:77)
        at org.apache.jsp.descarga_jsp._jspService(descarga_jsp.java:94)
        at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
        at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:377)
        at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
        at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
        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:857)
        at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
        at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
        at java.lang.Thread.run(Thread.java:619)
¿Alguien puede orientarme con este problema?

Muchísimas gracias!!
  #4 (permalink)  
Antiguo 26/08/2010, 10:37
 
Fecha de Ingreso: junio-2009
Mensajes: 9
Antigüedad: 14 años, 10 meses
Puntos: 0
Respuesta: Forzar descarga de archivo en JAVA (JSP)

El problema es que solo se puede escribir una sola vez al flujo de salida. Tendras que colocar un return despues de in.close() de tal manera que se evite la escritura nuevamente al flujo de salida.
  #5 (permalink)  
Antiguo 26/08/2010, 11:07
 
Fecha de Ingreso: abril-2008
Mensajes: 9
Antigüedad: 16 años
Puntos: 0
Respuesta: Forzar descarga de archivo en JAVA (JSP)

Muchas gracias por responder!

Yo tengo ese código en un fichero jsp aparte, y lo que hago es llamar a ese fichero pasandole el nombre del fichero a descargar por url. A continuación salta esa excepción, por lo que no sé donde colocar el return.

A ver si me puedes echar una mano!!
  #6 (permalink)  
Antiguo 26/08/2010, 15:22
 
Fecha de Ingreso: junio-2009
Mensajes: 9
Antigüedad: 14 años, 10 meses
Puntos: 0
Respuesta: Forzar descarga de archivo en JAVA (JSP)

Bueno yo tengo un proceso como el tuyo. En un proyecto donde uso struts, desde un jsp se invoca el action el cual procesa la informacion del formulario contenido en el jsp. Entre los procesos del action estan generar un archivo de excel y descargarlo del servidor. El problema era que en el action al ecribir el archivo al flujo de salida y luego tratar de hacer el forward para dirigir al usuario a la siguiente pagina jsp sacaba el mismo error que tu tienes, entonces lo que tuve que hacer es hacer un return justo despues de hacer la descarga del archivo y dejar al usuario en la misma pagina donde hizo la descarga es decir el forward nunca se ejecutaba. Luego el mismo usuario podia salir de esa pagina escogiendo cualquier otra opcion del menu principal. Ahora en verdad de un jsp a otro jsp no se exactamente. Pero te cuento mi experencia y asi podemos pensar en una solución.
  #7 (permalink)  
Antiguo 26/08/2010, 15:39
 
Fecha de Ingreso: junio-2009
Mensajes: 9
Antigüedad: 14 años, 10 meses
Puntos: 0
Respuesta: Forzar descarga de archivo en JAVA (JSP)

Basicamente el problema es que cuando escribes al outputstream es como si hicieras un submit de la pagina lo cual envia el contenido al servidor y habiendo ya hecho ese "submit" no puedes volver a hacerlo. Entonces cuando la pagina termina de descargar el archivo e intenta ir a la siguiente pagina esta haciendo un submit pero ya se hizo uno aunque no lo sea explicitamente.
  #8 (permalink)  
Antiguo 27/08/2010, 08:12
 
Fecha de Ingreso: abril-2008
Mensajes: 9
Antigüedad: 16 años
Puntos: 0
Respuesta: Forzar descarga de archivo en JAVA (JSP)

Pero yo no hago ningún submit, no hago click sobre ningún botón tipo submit, simplemente al hacer click sobre el enlace, hago un link hacia el fichero jsp pasándole el nombre del fichero a descargar y es en ese momento en el que salta la excepción(Mientras ejecuta el código de descarga).

Una posible solución que he encontrado y que me funciona, es poner el código anterior en un servlet, y al hacer click sobre el enlace de descargar el fichero, le pasa al servlet el nombre del fichero por la URL y este se descarga sin ningún problema y sin provocar la dichosa excepción.
Pero colocando el código anterior en un jsp, no hay forma. He probado colocando flush y close en todos los outPutStream, pero no hay forma.

Si alguien conoce una solución para esto, se agradecería el detalle.

Muchas gracias!!!

Última edición por hanem; 27/08/2010 a las 08:59
  #9 (permalink)  
Antiguo 24/11/2010, 15:40
Avatar de eaanillol  
Fecha de Ingreso: septiembre-2010
Ubicación: Bogota - Colombia
Mensajes: 25
Antigüedad: 13 años, 7 meses
Puntos: 0
De acuerdo Respuesta: Forzar descarga de archivo en JAVA (JSP)

Bueno ami tambien me paso lo mismo con un pdf que genere de un reporte jasper, todo esto en un jsp, las intrucciones que agregue para que mefuncionara y no saliera el error fueron:

Código java:
Ver original
  1. try{
  2. ServletOutputStream ouputStream = response.getOutputStream();
  3.  
  4. ouputStream.write(bytes, 0, bytes.length);
  5.  
  6. /*Limpiamos y cerramos flujos de salida*/
  7. ouputStream.flush();
  8. ouputStream.close();
  9. {
  10.  System.out.print("Igual se descarga");
  11. }


sin embargo cuando vuelvo a cargar la pagina vuelve a descargar el archivo, alguna sugerencia??
  #10 (permalink)  
Antiguo 12/11/2015, 13:12
 
Fecha de Ingreso: noviembre-2015
Mensajes: 1
Antigüedad: 8 años, 5 meses
Puntos: 0
Respuesta: Forzar descarga de archivo en JAVA (JSP)

Tu problema está en la primer línea
<!--contents of download.jsp-->
Eso es un comentario de HTML y es lo primero que envías por lo que forma parte de tu respuesta desde el JSP, haciendo que el getOutputStream sea llamado para enviar ese comentario.

Eliminalo y con eso tus problemas estarán resueltos.

Saludos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:53.