Estoy desarrollando una aplicación web en Java / Struts. En una página JSP tengo que poner un listado de enlaces, los cuáles, al pulsarlos, invoca una descarga del archivo elegido al ordenador cliente.
Pero me lanza el error "getOutputStream() ya ha sido llamado para esta respuesta". He revisado el código y no tengo más que una sola llamada a ese método, y no entiendo por qué me salta. ¿Alguien podría ayudarme?
Este es el código que lanza la excepción:
Código PHP:
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;
}
}
}
Gracias.