Error con getOutputStream()

Estoy desarrollando mi PFC en Java / Struts, y estoy atascado en un problema del que no he encontrado aún respuesta.
Tengo programada una acción que permita descargar del servidor un fichero que el cliente elija. Sin embargo, una excepción (IllegalException, si no recuerdo mal) que dice que "getOutputStream() ya ha sido llamado para esta respuesta" y no entiendo por qué (he comprobado que solamente se llame una vez a dicha función). Adjunto a continuación el código de la clase Java que da el error:
package biblioteca.registrados.archivos;
import biblioteca.factory.ArchivosDAO;
import biblioteca.factory.MysqlDAOFactory;
import biblioteca.sesion.ArchivoVO;
import biblioteca.sesion.ProyectoVO;
import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.util.Collection;
import java.util.Iterator;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.struts.action.ActionError;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ActionMessages;
/**
* Maneja la lógica de negocio para descargar el archivo asociado a un Proyecto de Fin de Carrera.
*
* @poseidon-object-id [Im20e52fem10f92dd2f0amm7df1]
* @author David Rguez.
*/
public class DescargaFicheroBean {
/**
*
*
* @poseidon-object-id [Im20e52fem10f92dd2f0amm65fb]
* @return
* @param req
* @param res
*/
public synchronized ActionMessages descargar(HttpServletRequest req, HttpServletResponse res) {
// Variables
HttpSession sesion = req.getSession();
ActionMessages errores = null;
Collection archivos = (Collection)sesion.getAttribute("losFicheros");
ArchivoVO archivo = null;
int id = Integer.parseInt(req.getParameter("id"));
int contador = 0;
int bytesLeidos = 0;
byte[] buffer = new byte[8192];
try {
// Recuperamos la ruta
Iterator arch = archivos.iterator();
while (contador < id){
contador++;
archivo = (ArchivoVO) arch.next();
}
String ruta = archivo.getRuta();
int tamaño = archivo.getTamaño();
String nombre = archivo.getNombreArchivo();
// Completamos la ruta
String rutaCompleta = sesion.getServletContext().getRealPath(ruta);
// Recuperamos el contenido del archivo al que apunta la ruta y lo colocamos en la respuesta
// También rellenamos el resto de información
res.setContentLength(tamaño);
res.setContentType("APPLICATION/OCTET-STREAM");
//res.setContentType("application/x-file-download");
res.setHeader("Content-disposition", "attachment; filename=\"" + nombre+"\"");
ServletOutputStream salida = res.getOutputStream();
FileInputStream descarga = new FileInputStream(rutaCompleta);
while ((bytesLeidos = descarga.read(buffer, 0, 8192)) != -1) {
salida.write(buffer, 0, bytesLeidos);
}
salida.flush();
salida.close();
descarga.close();
return null;
}catch (Exception e) {
if (errores == null)
errores = new ActionMessages();
errores.add("errorGeneral",new ActionMessage("error.general"));
return errores;
}
}
}

1 respuesta

Respuesta
1
Eso que estas haciendo es un poco extraño, ¿puedes probar a sustituir getOutputStream por getWriter()?.
Si eso no te funciona házmelo saber.
He estado mirando ese método, pero con un PrintWriter no puedo sacar datos de un byte[] para la descarga.
Ya pero podrías usar el método println y adaptar tu software para que envíe lo que necesitas, yo que tu comprobaría si compila y ejecuta y después me ocuparía de la implementación concreta que necesitas.
En primer lugar, lamento la tardanza.
Ya solucioné el problema, y no tenía nada que ver con la propia llamada a getOutputStream.
Resulta que en la línea
FileInputStream descarga = new FileInputStream(rutaCompleta);
La variable rutaCompleta era nulo (al menos eso supongo), ya que eliminé de la base de datos la columna "ruta" (un cambio de planteamiento) y el método getRuta() del objeto ArchivoVO devuelve nulo; pero como el error hacía referencia al método getOutputStream no llegué a darme cuenta de eso en ningún momento (de hecho, lo he descubierto por pura casualidad).
Es lo que no me gusta del mundo de la programación: la poca precisión que suelen tener los mensajes de error o warnings.
En cualquier caso, muchas gracias por su tiempo.
David Rguez.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas