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;
}
}
}
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 de consultoriaj
1