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

Error con getOutputStream

Estas en el tema de Error con getOutputStream en el foro de Java en Foros del Web. Hola amigos, tengo un problema, por medio de un link para abrir o descargar un arhicvo de mi servidor llamo al siguiente jsp de esta ...
  #1 (permalink)  
Antiguo 28/01/2014, 16:19
 
Fecha de Ingreso: septiembre-2005
Mensajes: 1.289
Antigüedad: 19 años, 1 mes
Puntos: 3
Pregunta Error con getOutputStream

Hola amigos, tengo un problema, por medio de un link para abrir o descargar un arhicvo de mi servidor llamo al siguiente jsp de esta forma:

Código HTML:
<a onclick=\"window.open('salida.jsp?arch=" + cveDenuncia + "_" + listaDocSoporte.get(i).getNombreArchivo() + "');\" href=\"#\">" + listaDocSoporte.get(i).getNombreArchivo() + "</a> 
El jsp es salida.jsp el cuál me permite descargar los archivos que en listo en otro jsp.

El contenido del jsp "salida" solo contiene:

Código HTML:
<%
 /*  */ 
        ServletOutputStream ouputStream = null;

        try {
            String nomFile = request.getParameter("arch");
            FileInputStream archivo = new FileInputStream(request.getServletContext().getRealPath("/") + "archivos/" + nomFile);
            int longitud = archivo.available();
            byte[] datos = new byte[1024];//error aquí
//archivo.read(datos);
//archivo.close();
            response.setContentType("application/octet-stream");
            response.setHeader("Content-Disposition", "attachment;filename=" + nomFile);
            ouputStream = response.getOutputStream();
//byte[] buf = new byte[1024];
            int bytesRead;
            while ((bytesRead = archivo.read(datos)) > 0) {
                ouputStream.write(datos, 0, bytesRead);
            }
            archivo.close();
//ouputStream.write(datos);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            ouputStream.flush();
            ouputStream.close();
            //out.clear();//estas líneas limpian la información enviada a consola
            //out = pageContext.pushBody();
        }
     
    %>
Si lo ejecuto me descarga el cualquier archivo sin problema, el tema es que me manda un error en consola:

Código HTML:
ene 28, 2014 2:59:32 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [jsp] in context with path [/programa] threw exception [java.lang.IllegalStateException: getOutputStream() ya ha sido llamado para esta respuesta] with root cause
java.lang.IllegalStateException: getOutputStream() ya ha sido llamado para esta respuesta
Ya he indagado un poco, pero no encuentro una respuesta que me funcione, en un lado comentan que tal vez mando algo antes al cliente que el archivo com tal, con un out.print tal vez, pero no lo hago, otro sugiere solo limpiar la salida de consola pero no me parece indicado, alguien tiene alguna sugerencia?

Saludos y gracias de antemano!
__________________
Wow! No se que decir...
  #2 (permalink)  
Antiguo 29/01/2014, 05:15
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 20 años, 1 mes
Puntos: 454
Respuesta: Error con getOutputStream

Hola:

No es necesario un out.println, basta con que el jsp tenga cualquier cosa que vaya hacia el navegador antes de que uses el outputStream. Tu fichero jsp debe empezar como primer caracter con un <% y ahí el código. Si antes de ese <% hay cualquier cosa (el típico <doctype con el que se suelen empezar los ficheros) o incluso espacios en blanco, esas cosas ya se envían al navegador y te dará ese error en cuanto intentes usar el ouputStream.

Por supuseto, si puedes poner los <%@ page import que necesites, ya que esos no se envían al navegador, pero quizás no puedas usar un retorno de carro entre uno y otro, tendráis que ponerlos todos seguidos y seguido el <% con tu código.

Para lo que pretendes es mejor un Servlet, entre otras cosas, te evitaría esos problemas.

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #3 (permalink)  
Antiguo 29/01/2014, 09:44
 
Fecha de Ingreso: septiembre-2005
Mensajes: 1.289
Antigüedad: 19 años, 1 mes
Puntos: 3
Respuesta: Error con getOutputStream

Hola chuidiang, gracias por tu respuesta, analizándolo tienes mucha razón, lo probaré, de todos modos como mencionas, pasé mejor el código a un servlet para evitar cualquier complicación! dejo el código por si se le ofrece a alguien más! Gracias y saludos!

Código:
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        //PrintWriter out = response.getWriter();
        //out.close();
        ServletOutputStream ouputStream = null;
        try {
            String nomFile = request.getParameter("arch");
            FileInputStream archivo = new FileInputStream(request.getServletContext().getRealPath("/") + "archivos/" + nomFile);
            int longitud = archivo.available();
            byte[] datos = new byte[1024];

            response.setContentType("application/octet-stream");
            response.setHeader("Content-Disposition", "attachment;filename=" + nomFile);
            ouputStream = response.getOutputStream();

            int bytesRead;
            while ((bytesRead = archivo.read(datos)) > 0) {
                ouputStream.write(datos, 0, bytesRead);
            }
            archivo.close();

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            ouputStream.flush();
            ouputStream.close();
        }
    }
__________________
Wow! No se que decir...

Etiquetas: jsp
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 13:50.